比较两个对象数组,并更新第二个对象的值。非常慢

时间:2017-07-09 18:30:22

标签: javascript arrays performance lodash

下面是我的工作代码示例,但我遇到的问题是,当我有超过100k的记录时,这个脚本需要很长时间才能运行,我想知道是否有更快的方法来执行此操作。 / p>

注意:我有两个对象数组,我需要根据第一个数组来设置第二个数组的对象名称。 ID将在两者之间匹配,订单将是随机的。

const _ = require('lodash');

let res1 = [
  {id:1, name:'Sandra'},
  {id:2, name:'Bill'},
  {id:3, name:'Peter'},
  {id:4, name:'Jill'}
];

let res2 = [
  {id:2, name:'John'},
  {id:4, name:'Bobby'}
];

_.forEach(res1, function(data1) {
  _.forEach(res2, function(data2) {
    if (data1.id === data2.id) {
      data2.name = data1.name;
    }
  });
});

// res2 = [{id:2, name:'bill'},{id:4, name:'Jill'}];

2 个答案:

答案 0 :(得分:1)

按id res1创建地图,然后迭代第二个数组,并替换找到res1map的每个ID的名称。

const res1 = [
  {id:1, name:'Sandra'},
  {id:2, name:'Bill'},
  {id:3, name:'Peter'},
  {id:4, name:'Jill'}
];

const res2 = [
  {id:2, name:'John'},
  {id:4, name:'Bobby'}
];

const res1Map = _.keyBy(res1, 'id');

res2.forEach((o) => res1Map[o.id] && (o.name = res1Map[o.id].name));

console.log(res2);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

答案 1 :(得分:0)

使用forEachfind的简单解决方案:

let res1 = [
  {id:1, name:'Sandra'},
  {id:2, name:'Bill'},
  {id:3, name:'Peter'},
  {id:4, name:'Jill'}
];

let res2 = [
  {id:2, name:'John'},
  {id:4, name:'Bobby'}
];

res2.forEach((item) => {
  item.name = res1.find((person) => person.id === item.id).name
}); 

console.log(res2);