数组重映射

时间:2017-04-26 19:38:40

标签: javascript arrays sorting

我们有一个对象数组

var items = [
    { id: 1, order_assigned: 2},
    { id: 2, order_assigned: 4},
    { id: 3, order_assigned: 1},
    { id: 4, order_assigned: 5},
    { id: 5, order_assigned: 3}
];

每个都有id和一些订单号。 例如,用户将ID为2的订单号更改为0.现在,数组将如下所示:

var items = [
        { id: 1, order_assigned: 2},
        { id: 2, order_assigned: 0},
        { id: 3, order_assigned: 1},
        { id: 4, order_assigned: 5},
        { id: 5, order_assigned: 3}
    ];

现在我们需要重新索引order_assigned以填补order_assigned顺序中的空白。 即数组应该看起来像这样

var items = [
        { id: 1, order_assigned: 2},
        { id: 2, order_assigned: 0},
        { id: 3, order_assigned: 1},
        { id: 4, order_assigned: 4},
        { id: 5, order_assigned: 3}
    ];

ID为4的项目将订单号从5更改为4,因为没有4个订单号的项目。

order_assigned中的编号应按顺序从1到最后建立的排名。 1,2,3,4。如果有人输入1,2,5,7到order_assigned,它必须转换为1,2,3,4。 换句话说,如果订单号中存在间隙,则必须重新计算其后的所有数字。不需要依靠物品订购。

完全坚持如何以正确的方式做到这一点。请帮助!

2 个答案:

答案 0 :(得分:1)

我认为您要求我们根据order_assigned订购此广告,然后缩小order_assigned之间的差距。

我首先对数组进行排序,然后循环遍历它。然后我用当前索引替换order_assigned值。



var items = [
    { id: 1, order_assigned: 2},
    { id: 2, order_assigned: 0},
    { id: 3, order_assigned: 1},
    { id: 4, order_assigned: 5},
    { id: 5, order_assigned: 3}
];

items.sort(function(a, b) {
    return a.order_assigned - b.order_assigned;
});

var counter = 0;

for (var index in items) {
    if (items[index].order_assigned === 0) {
        continue;
    } // leave orders that are 0 the same

    items[index].order_assigned = ++counter;
}

items.sort(function(a, b) {
    return a.id - b.id;
}); // sort again on the ID field

console.log(items);




答案 1 :(得分:1)

function sortCloseGap(array) {
   return array.slice() // copy
     .sort(function(a, b) { return a.order_assigned - b.order_assigned }) // sort
     .map(function(item, index) { // assign new order
         item.order_assigned = index + 1;
         return item;
     });
}

我希望你不要介意可变性。