简体   繁体   English

按预定义的顺序对javascript数组进行排序

[英]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: 订单应该是:

  • Apples: 4 苹果:4
  • Oranges: 2 橘子:2
  • Grapes: 1 葡萄:1
  • Peaches: 3 桃子:3
  • Bananas: 6 香蕉:6
  • Watermelon: 5 西瓜:5

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM