通过Javascript中给定的不完整订单数组对对象数组进行排序
Posted
技术标签:
【中文标题】通过Javascript中给定的不完整订单数组对对象数组进行排序【英文标题】:Sort array of objects by given incomplete array of orders in Javascript 【发布时间】:2021-03-04 16:42:21 【问题描述】:我有一个对象数组:
var items = [
"id":"sugar",
"type": 'eatables'
,
"id":"petrol",
"type": 'utility'
,
"id":"apple",
"type": 'fruits'
,
"id":"mango",
"type": 'fruits'
,
"id":"book",
"type": 'education'
];
现在我有另一个订单数组,我想借助它对 items
数组进行排序:
var orders = [
"id":"sugar",
"order":5
,
"id":"book",
"order":1
];
到目前为止,我在逻辑中尝试的是,我放置了太多循环,以至于完全造成混乱。
谁能建议我为此提供一个简短且优化的逻辑?
【问题讨论】:
数组的其他元素会发生什么? @MihaiAlexandru-Ionut 他们保持与以前相同的顺序 【参考方案1】: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);
【讨论】:
【参考方案2】:一种方法可能是创建一个字典,它将为每个元素保留order
。另外,我已经迭代了整个items
数组来存储不在orders
数组中的元素的位置。
首先,我将声明一个数组,它保留整个订单,因此是一个包含1..N
元素的数组。
var orderNumbers = Array.from(length: items.length, (_, v) => v + 1);
然后我开始通过迭代 orders
数组来创建字典,并从 orderNumbers
中删除 orders。
最后一步是迭代 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);
【讨论】:
是的,现在它的工作完美。我接受你的回答。但是我们可以做更多的事情来优化逻辑或减少代码行和东西...... @StormTrooper,我已经更新了我的答案。这就是我使用字典的原因,因为查找具有O(1)
的复杂性,并且我每次都试图避免使用find
函数。以上是关于通过Javascript中给定的不完整订单数组对对象数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章