javascript - 用 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 个要循环的事件,那么性能呢?
谢谢
解决方案
一种简单的方法是循环更新数组 (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);
根据性能,还有许多其他未知因素。例如,如果这是一个经常发生的运行时操作,但底层数据是相当静态的,那么为什么不创建并将结果存储在数据存储中呢?
推荐阅读
- python - Django REST 框架 - 使用日期外部 Views.py 文件过滤查询参数
- vue.js - 如何从 nuxt 中的 vueRouter 访问 vuex 状态
- flutter - 如何摆脱颤振中的无效双重错误
- reactjs - 如何正确 setState 和 useEffect 从 React(钩子)中的对象读取和显示值?
- c# - 如何使用多线程优化大文件中单词和字符的计数?
- firebase-authentication - Firebase 身份验证:使用谷歌选项登录是否有任何限制
- amp-html - 怎么会出现粘性adsense?
- c - 在 C 中为整数分配双精度会导致程序崩溃
- shell - 设置 -e 时 Posix Shell 测试非零退出代码脚本终止
- javascript - 在 li/ul 表之前格式化 div b 标签