2013-02-14 11 views
7

アルファベット順ではなく、カスタムオーダーでどのように並べ替えることができますか?この配列/オブジェクトがあるとします:カスタムオーダーで並べ替える

var somethingToSort = [{ 
    type: "fruit", 
    name: "banana" 
}, { 
    type: "candy", 
    name: "twix" 
}, { 
    type: "vegetable", 
    name: "broccoli" 
}, { 
    type: "vegetable", 
    name: "carrot" 
}, { 
    type: "fruit", 
    name: "strawberry" 
}, { 
    type: "candy", 
    name: "kitkat" 
}, { 
    type: "fruit", 
    name: "apple" 
}]; 

ここでは、果物、野菜、キャンディーの3種類があります。今、私はこの配列を並べ替え、すべての果物が最初、果物が後に来て、野菜が最後になるようにします。各タイプは、アイテムをアルファベット順にソートする必要があります。

var somethingToSort = [{ 
    type: "fruit", 
    name: "apple" 
}, { 
    type: "fruit", 
    name: "banana" 
}, { 
    type: "fruit", 
    name: "strawberry" 
}, { 
    type: "candy", 
    name: "kitkat" 
}, { 
    type: "candy", 
    name: "twix" 
}, { 
    type: "vegetable", 
    name: "broccoli" 
}, { 
    type: "vegetable", 
    name: "carrot" 
}]; 

誰でもどのようにこのためのスクリプトを作成するアイデア:私たちは、あなたがソートした後、この配列で終わるだろう、だから、基本的にsortArrayOnOrder (["fruit","candy","vegetable"], "name");のような関数を使用しますか?

+0

はhttp://www.google.de/search?q=stackoverflow+javascript+sort+array+([ソート方法]」他の多くも参照してください。 +オブジェクト) "の質問 – Bergi

答えて

12

Cerbrus'コードの改良版:

var ordering = {}, // map for efficient lookup of sortIndex 
    sortOrder = ['fruit','candy','vegetable']; 
for (var i=0; i<sortOrder.length; i++) 
    ordering[sortOrder[i]] = i; 

somethingToSort.sort(function(a, b) { 
    return (ordering[a.type] - ordering[b.type]) || a.name.localeCompare(b.name); 
}); 
+0

hm、sortOrderからオブジェクトを構築することをお勧めします。関数が呼び出されるたびに 'indexOf'を使う必要はありません。 +1 – Cerbrus

+0

恐ろしい。それは動作します。ありがとう! – RemiDG

0

Array.sortでは、カスタムソートロジックを適用できるソート機能を使用できます。

2

はこれを試してみてください:

var sortOrder = ['fruit','candy','vegetable']; // Declare a array that defines the order of the elements to be sorted. 
somethingToSort.sort(
    function(a, b){        // Pass a function to the sort that takes 2 elements to compare 
     if(a.type == b.type){     // If the elements both have the same `type`, 
      return a.name.localeCompare(b.name); // Compare the elements by `name`. 
     }else{         // Otherwise, 
      return sortOrder.indexOf(a.type) - sortOrder.indexOf(b.type); // Substract indexes, If element `a` comes first in the array, the returned value will be negative, resulting in it being sorted before `b`, and vice versa. 
     } 
    } 
); 

また、あなたのオブジェクトの宣言が正しくありません。代わりに:

{ 
    type = "fruit", 
    name = "banana" 
}, // etc 

用途:

{ 
    type: "fruit", 
    name: "banana" 
}, // etc 

ので、:年代と=兆候を交換してください。

+0

+1、素敵なもの。効率向上のための私の答えを参照してください。 – Bergi

+0

Wups、の代わりに=を残念。ちょうどここに例を書いて、パスタを何もコピーせず、値を割り当てるのを忘れてしまった。 Imも=演算子を使って値を代入していましたhaha:P – RemiDG

関連する問題