2017-03-22 6 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

とどの部分がうまくいきませんか? –