[英]Sort javascript Array in a pre-defined order
I have a javascript
array
that I need to sort in a pre-defined order. 我有一个
javascript
array
,我需要按预定义的顺序排序。 It seems random, but they do need to be in a specific order. 它似乎是随机的,但它们确实需要按特定顺序排列。
Here is where I started, but am not sure how to finish: 这是我开始的地方,但不知道如何完成:
// Items
var items = ["Apples", "Oranges", "Grapes", "Peaches", "Bananas", "Watermelon"];
var itemsOrdered = {};
// Order how I want them
for (i in items) {
var item = items[i];
if (item == 'Apples') {
itemsOrdered['4'] = item;
} else if (item == 'Oranges') {
itemsOrdered['2'] = item;
} else if (item == 'Grapes') {
itemsOrdered['1'] = item;
} else if (item == 'Peaches') {
itemsOrdered['3'] = item;
} else if (item == 'Bananas') {
itemsOrdered['6'] = item;
} else if (item == 'Watermelon') {
itemsOrdered['5'] = item;
}
}
Order should be: 订单应该是:
All of these items might not always be in the array. 所有这些项目可能并不总是在数组中。 It might only be Apples and Bananas, but they still need the same sort positions.
它可能只是苹果和香蕉,但它们仍然需要相同的排序位置。
I have to set this manual sort order after the array is created because our system prints them out in this random order which we then need to sort correctly. 我必须在创建数组后设置此手动排序顺序,因为我们的系统以随机顺序打印出来,然后我们需要正确排序。
In the end, I need the correctly sorted fruits back in an array. 最后,我需要将正确排序的水果放回到数组中。
Ideas? 想法?
Put your ordering in an object, like this: 将您的订单放在一个对象中,如下所示:
var ordering = {};
ordering["Apples"] = 4;
ordering["Oranges"] = 2;
... // etc.
Then sort your items
array using Array.sort(compareFunction(a, b))
, passing it a sorting function to check your objects against ordering
(left as an exercise). 然后使用
Array.sort(compareFunction(a, b))
对items
数组进行排序,并向其传递一个排序函数以检查对象是否违反ordering
(左侧作为练习)。 Check out https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/sort to see how compareFunction()
is used. 查看https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/sort ,了解如何使用
compareFunction()
。
Edit: Here's an implementation: 编辑:这是一个实现:
var ordering = {"Apples":4, "Oranges":2, "Grapes":1,
"Peaches":3, "Bananas":6, "Watermelons":5};
var items = ["Apples", "Oranges", "Grapes",
"Peaches", "Bananas", "Watermelons"];
items.sort(function(a,b) { return ordering[a] - ordering[b]; })
> ["Grapes", "Oranges", "Peaches", "Apples", "Watermelons", "Bananas"]
Try: 尝试:
var items = ["Apples", "Bananas", "Watermelons"];
var itemsOrdered = [];
var theOrder = ["Grapes", "Oranges", "Peaches", "Apples", "Watermelons", "Bananas"];
for (var i = 0; i < theOrder.length; i++) {
if (items.indexOf(theOrder[i]) > -1) {
itemsOrdered.push(theOrder[i]);
}
}
console.log(itemsOrdered);
DEMO: http://jsfiddle.net/JPNGS/ 演示: http : //jsfiddle.net/JPNGS/
The order is defined in theOrder
. 顺序被定义
theOrder
。 items
contains the available items. items
包含可用的项目。 itemsOrdered
contains the available items, ordered. itemsOrdered
包含订购的可用商品。
Your code simplifies to: 您的代码简化为:
var itemsOrdered = {1:"Peaches",2:"Oranges",3:"Grapes",4:"Apples",5:"Watermelon",6:"Bananas"};
In other words, it's completely pointless. 换句话说,这完全没有意义。 Just define them in the order you want them.
只需按照您想要的顺序定义它们。
First convert your object to an Array: 首先将对象转换为数组:
var sortOrder = [];
for (i in itemsOrdered)
sortOrder[i-1] = itemsOrdered[i];
Then use .filter()
like this: 然后像这样使用
.filter()
:
var result = sortOrder.filter(item) {
return items.indexOf(item) !== -1;
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.