2017-03-22 74 views
-1

我有一個對象數組,我想按照常見的類型進行排序。 有些對象的類型是'x',有些是'y',有些是'z'。按常用字段對數組進行排序(javasciript)

現在,我可以對它進行排序並將所有'x'放在前面。不過,我也想爲'y'和'z'做同樣的事情。最後,所有的'x'將在前面,然後是'y',然後是'z'。

list.sort((a, b) => { 
    if (a.type !== b.type) { 
     if (a.type === 'x') { return -1; } 
     return 1; 
    } 
    return a.name.localeCompare(b.name); 
    }); 

任何幫助將不勝感激。

+2

請點擊''''''片段編輯器並創建一個[mcve] – mplungjan

+0

,請添加一些數據進行排序和想要的結果。 –

+1

你是否總想排序'type'按字母順序升序?或者是x,y,z,巧合? – mhodges

回答

0

一個簡單的解決辦法是定義類型的一個數字順序,並使用經典的方法來排序數組由數字屬性對象:

var order = {'x': 0, 'y': 1, 'z': 2} 
 
var data = [ 
 
    {type: 'z'}, 
 
    {type: 'y'}, 
 
    {type: 'x'}, 
 
    {type: 'x'}, 
 
    {type: 'y'}, 
 
    {type: 'z'} 
 
] 
 

 
var sortedData = data.sort(function(a, b) { 
 
    return order[a.type] - order[b.type] 
 
}) 
 

 
console.log(sortedData)

注意,你可能要包括一些錯誤處理,例如對於在order地圖中未保留的類型。

+0

非常感謝!這是一個非常優雅和簡單的解決方案。有效! :) – Nicky

1

您可以按排序順序使用type的對象。

var list = [{ type: 'a', name: 'z' }, { type: 'b', name: 'a' }, { type: 'c', name: 'b' }, { type: 'x', name: 'c' }, { type: 'x', name: 'd' }, { type: 'y', name: 'e' }, { type: 'y', name: 'f' }, { type: 'z', name: 'g' }, { type: 'z', name: 'h' }, ] 
 

 
list.sort(function (a, b) { 
 
    var order = { x: -1, y: -1, z: -1, default: 0 }; 
 
    return (order[a.type] || order.default) - (order[b.type] || order.default) || a.name.localeCompare(b.name); 
 
}); 
 

 
console.log(list);
.as-console-wrapper { max-height: 100% !important; top: 0; }

它與

{ 
    f: -2,   // top 
    x: -1,   // \ 
    y: -1,   // a group after top 
    z: -1,   ///
    default: 0  // a default value for not mentioned types for sorting in the middle 
    a: 1   // after the common parts 
    d: 2   // bottom 
} 
+0

謝謝你的回答!但由於某種原因,它不適合我。我嘗試了另一個用戶的解決方案,它的工作原理。感謝您發佈:) – Nicky

+1

和哪部分不工作? –