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)
尝试这个:
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)
因此,将=符号替换为:。