35

アルファベット順ではなく、カスタムオーダーで配列をソートする方法を知りたいと思っていました。この配列/オブジェクトがあると想像してください:

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種類が入っています。ここで、この配列を並べ替えて、すべての果物が最初に、キャンディーが果物の後に来て、野菜が最後になるようにします。各タイプは、アイテムをアルファベット順にソートする必要があります。基本的sortArrayOnOrder ( ["fruit","candy","vegetable"], "name" );に、並べ替え後にこの配列になります。

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"
}];

このためのスクリプトを作成する方法を知っている人はいますか?

4

4 に答える 4

53

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);
});
于 2013-02-14T10:31:59.533 に答える
9

これを試して:

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

したがって、=記号をに置き換え:ます。

于 2013-02-14T10:27:29.407 に答える
-3

Array.sort は、カスタムの並べ替えロジックを適用できる並べ替え関数を受け入れます。

于 2013-02-14T10:23:34.247 に答える