2 回答
TA贡献1871条经验 获得超8个赞
一种方法可能是创建一个字典,该字典将保留order每个元素的 。另外,我还迭代了整个items数组来存储不在数组中的元素的位置orders。
首先,我将声明一个保留整个订单的数组,即一个包含元素的数组。1..N
var orderNumbers = Array.from({length: items.length}, (_, v) => v + 1);
然后我开始通过迭代数组来创建字典orders并从中删除订单orderNumbers。
最后一步是迭代items数组并使用shift方法到"pop"第一个元素。
最终的字典看起来像
{
"sugar": 2,
"book": 3,
"petrol": 1,
"apple": 4,
"mango": 5
}
在此代码中,我使用了一本字典,因为它的复杂性lookup为.O(1)
var items = [ { "id":"sugar", "type": 'eatables' }, { "id":"petrol", "type": 'utility' }, { "id":"apple", "type": 'fruits' }, { "id":"mango", "type": 'fruits' }, { "id":"book", "type": 'education' } ], orders = [ { "id":"sugar", "order":2 }, { "id":"book", "order":3 } ], orderNumbers = Array.from({length: items.length}, (_, v) => v + 1);
var ordersDict = orders.reduce((acc, item) => {
acc[item.id] = item.order;
//remove from order numbers
let index = orderNumbers.findIndex(el => el == item.order);
orderNumbers.splice(index, 1);
return acc;
}, {});
for(let i = 0; i < items.length; i++){
if(!ordersDict.hasOwnProperty(items[i].id)){
ordersDict[items[i].id] = orderNumbers[0];
orderNumbers.shift();
}
}
//sort the array
items.sort((a,b) => ordersDict[a.id] - ordersDict[b.id]);
console.log(items);
TA贡献2012条经验 获得超12个赞
let oorder = new Object();
orders.map(item=>{oorder[item.id]=item.order});
var new_items = [];
items.map(item=>{new_items[oorder[item.id]-1]=item});
添加回答
举报