首页 > 解决方案 > 用 JavaScript 中另一个数组对象的数据替换数组中的对象

问题描述

假设我们有 2 个数组:

array1 有 1 个事件:

var array1 = [
      {
      start: '2018-04-24T10:00:00',
      end: '2018-04-24T11:00:00',
      title: 'Been to Break'
    }
  ];

array2 有 3 个事件:

  var array2 = [
      {
        start: '2018-04-24T08:00:00',
        end: '2018-04-24T10:00:00',
        title: 'Lunch'
      },
      {
        start: '2018-04-24T10:00:00',
        end: '2018-04-24T11:00:00',
        title: 'Break'
      },
      {
        start: '2018-04-24T13:00:00',
        end: '2018-04-24T14:00:00',
        title: 'Meeting'
      }
    ];

期望的结果应该是一个新数组:array3

var array3 = [
  { //event 1
    start: '2018-04-24T08:00:00',
    end: '2018-04-24T10:00:00',
    title: 'Lunch'
  },
  { //event 2
    start: '2018-04-24T10:00:00',
    end: '2018-04-24T11:00:00',
    title: 'Been to Break'
  },
  { //event 3
    start: '2018-04-24T13:00:00',
    end: '2018-04-24T14:00:00',
    title: 'Meeting'
  }
];

从 array3 中的预期结果可以看出,array2 中的事件 2 被 array1 中的事件 1 替换,因为开始值和结束值是匹配的。

这可以在 JavaScript 中完成吗?如果我们有 1000 个要循环的事件,那么性能呢?

谢谢

标签: javascriptarrays

解决方案


一种简单的方法是循环更新数组 (array1) 以在 array2 中找到匹配项,如果找到则替换它。

var array1 = [{
  start: '2018-04-24T10:00:00',
  end: '2018-04-24T11:00:00',
  title: 'Been to Break'
}];

var array2 = [{
    start: '2018-04-24T08:00:00',
    end: '2018-04-24T10:00:00',
    title: 'Lunch'
  },
  {
    start: '2018-04-24T10:00:00',
    end: '2018-04-24T11:00:00',
    title: 'Break'
  },
  {
    start: '2018-04-24T13:00:00',
    end: '2018-04-24T14:00:00',
    title: 'Meeting'
  }
];

array1.forEach((evUpdate) => {
  const matchIndex = array2.findIndex((ev) => ev.start === evUpdate.start && ev.end === evUpdate.end);

  if (matchIndex > -1) {
    array2.splice(matchIndex, 1, evUpdate);
  }
});

console.log(array2);

根据性能,还有许多其他未知因素。例如,如果这是一个经常发生的运行时操作,但底层数据是相当静态的,那么为什么不创建并将结果存储在数据存储中呢?


推荐阅读