按自定义订单排序

Rem*_*iDG 23 javascript arrays

我想知道如何在自定义订单上排序数组,而不是按字母顺序排序.想象一下你有这个数组/对象:

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"
}];
Run Code Online (Sandbox Code Playgroud)

在这里,我们有3种不同的类型:水果,蔬菜和糖果.现在我想对这个阵列进行排序,并确保所有水果都是第一个,糖果来自水果,蔬菜是最后的.每种类型都需要按字母顺序对其项目进行排序.我们将使用像sortArrayOnOrder ( ["fruit","candy","vegetable"], "name" );So这样的函数,你最终会在排序之后得到这个数组:

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"
}];
Run Code Online (Sandbox Code Playgroud)

有人知道如何为此创建脚本吗?

Ber*_*rgi 28

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);
});
Run Code Online (Sandbox Code Playgroud)


Cer*_*rus 5

尝试这个:

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.
        }
    }
);
Run Code Online (Sandbox Code Playgroud)

另外,您的对象声明不正确。代替:

{
    type = "fruit",
    name = "banana"
}, // etc
Run Code Online (Sandbox Code Playgroud)

使用:

{
    type: "fruit",
    name: "banana"
}, // etc
Run Code Online (Sandbox Code Playgroud)

因此,将=符号替换为: