通过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中给定的不完整订单数组对对象数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 442.数组中重复的数据 - JavaScript

如何拆分字符串 C# 并忽略字符串中的不完整单词

SQL - 按行对排序

javascript-适配器模式

如何根据第一个或第二个中的较大值对对数组进行排序

如何在给定的不活动时间后自动重新加载页面