【问题标题】:Replace elements in the array by elements from another array用另一个数组中的元素替换数组中的元素
【发布时间】:2019-09-27 15:43:54
【问题描述】:

我需要通过对象的 orderID 键将数组中的元素替换为另一个数组中的元素。如果元素不在数组中,则应该添加它。

我已经实现了它(下面的代码 sn-p 中的示例)并且它大部分都可以工作。

问题是我的实现在循环中使用了过滤器,这可能是大数据的性能问题。

可以不循环内循环实现吗?

let storageOrders = [
  {orderID:1, data:'data1'},
  {orderID:2, data:'data2'},
  {orderID:3, data:'data3'},
  {orderID:4, data:'data4'},
];
let summaryOrders = [
  {orderID:2, data:'data2_new'},
  {orderID:3, data:'data3_new'},
  {orderID:5, data:'data5'},
];
summaryOrders.forEach((order) => {
  storageOrders = storageOrders.filter(storageOrder => storageOrder.orderID !== order.orderID);
  storageOrders.push(order);
});
console.log(storageOrders);

【问题讨论】:

  • @Dznitry 您可以尝试对两个数组进行排序。即使对于大型数组,它也只有您现在执行的 nLog n 与 n^2。排序后,查看summaryOrders 并检查storageOrders 中的下一个元素。简单的。总操作将是:2nlog(n)+n。假设数组大小相似。如果没有,我让你做数学...... :-)

标签: javascript algorithm


【解决方案1】:

您可以使用storageOrderssummaryOrders 创建从orderID 到对象的映射(一个接一个,以便summaryOrders 中的值优先用于已经存在的ID)。然后你可以用Object.values重新创建你的最终数组:

let storageOrders = [
  {orderID:1, data:'data1'},
  {orderID:2, data:'data2'},
  {orderID:3, data:'data3'},
  {orderID:4, data:'data4'},
];
let summaryOrders = [
  {orderID:2, data:'data2_new'},
  {orderID:3, data:'data3_new'},
  {orderID:5, data:'data5'},
];

storageOrders = Object.values([...storageOrders, ...summaryOrders].reduce((a, c) => {
  a[c.orderID] = c;
  return a;
}, {}));
console.log(storageOrders);

【讨论】:

    【解决方案2】:

    您可以从现有订单创建一个对象,然后循环访问新/更新的订单以更新您现有的订单对象。这可能是完全存储数据的更好方法,但如果需要,您可以将更新后的对象转换回对象列表。

    const mergeOrders = (a, b) => {
      const obj = a.reduce((acc, order) => {
        acc[order.orderID] = order.data;
        return acc;
      }, {});
      
      for (const order of b) {
        obj[order.orderID] = order.data;
      }
      
      return Object.entries(obj).map(([id, data]) => ({ orderID: id, data: data }));
    };
    
    const storageOrders = [{ orderID: 1, data: 'data1' }, { orderID: 2, data: 'data2' }, { orderID: 3, data: 'data3' }, { orderID: 4, data: 'data4' }];
    const summaryOrders = [{ orderID: 2, data: 'data2_new' }, { orderID: 3, data: 'data3_new' }, { orderID: 5, data: 'data5' }];
    const orders = mergeOrders(storageOrders, summaryOrders);
    console.log(orders);
    // [{ orderID: 1, data: 'data1' }, { orderID: 2, data: 'data2_new' }, { orderID: 3, data: 'data3_new' }, { orderID: 4, data: 'data4' }, { orderID: 5, data: 'data5' }]

    【讨论】:

      猜你喜欢
      • 2013-07-04
      • 2019-12-20
      • 1970-01-01
      • 1970-01-01
      • 2016-11-11
      • 2021-12-12
      • 2012-11-13
      • 2020-03-19
      • 2015-11-09
      相关资源
      最近更新 更多