嵌套的forEach循环将对象添加到现有对象中的JavaScript

5

除了我下面所做的方式,还有更好的迭代两个对象数组的方法吗?这种做法看起来有点凌乱。我使用的是lodash库。

var array1 = [
   {id:4356, name: 'James', sex: 'male'}, 
   {id:7899, name: 'Jimmy', sex: 'male'}, 
   {id:2389, name: 'Dawn', sex: 'female'}
];

var array2 = [
    {id:4356, salary: 1000, job: 'programmer'}, 
    {id:7899, salary: 2000, job: 'tester'}, 
    {id:2389, salary: 3000, job: 'manager'}
];

输出示例:

console.log(array1[0])
{
    id:4356, 
    name: James, 
    sex: male, 
    person: {
        id:4356, 
        salary: 1000, 
        job: programmer
    }
}

功能:

_.forEach(array1, function(item1) {
    _.forEach(array2, function(item2) {
       if(item1.id === item2.id){
          item1.person = item2;
        }
     });
});

首先将其中一个数组转换为“id -> person”映射? - Felix Kling
可能是重复的问题:基于公共ID连接两个JS对象数组的功能方法 - nograde
Gruff Bunny的答案(链接如上)非常全面。 - nograde
2个回答

6

由于您正在使用lodash,因此可以使用_.find()方法根据id属性在array2中查找相应的对象。

_.forEach(array1, function(item1) {
    item1.person = _.find(array2, {id: item1.id});
});

值得指出的是,如果没有找到对象,这将导致未定义的person属性。 如果这是个问题,只需检查是否返回了一个对象即可:
_.forEach(array1, function(item1) {
    var obj = _.find(array2, {id: item1.id});
    if (obj) {
        item1.person = obj;
    }
});

没有 lodash,代码将会非常相似:

array1.forEach(function(item1) {
    item1.person = array2.find(function (item2) {
      return item2.id === item1.id;
    });
});

0
我会建立一个参考对象并向其添加内容,这样你就不需要加载第二个数组N次了。代码如下:
    var array1 = [{id:4356, name: 'James', sex: 'male'}, 
        {id:7899, name: 'Jimmy', sex: 'male'}, 
        {id:2389, name: 'Dawn', sex: 'female'}
    ];

    var array2 = [{id:4356, salary: 1000, job: 'programmer'}, 
        {id:7899, salary: 2000, job: 'tester'}, 
        {id:2389, salary: 3000, job: 'manager'}
    ];

    var array3 = {};

    for(var i in array1) {
        array3[array1[i]['id']] = array1[i];
    }

    for(var i in array2) {
        for(var key in array2[i]) {
            array3[array2[i]['id']][key] = array2[i][key];
        }
    }

这将为您提供一个具有两个数组属性的对象,例如:
    Object {2389: Object, 4356: Object, 7899: Object}

这样做的好处是您只需对每个数组进行一次迭代。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接