5

Is there a better way to iterate over two array of objects than what I have done below? It seems messy to do it this way. I'm using 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'}
];

Example output:

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

Function:

_.forEach(array1, function(item1) {
    _.forEach(array2, function(item2) {
       if(item1.id === item2.id){
          item1.person = item2;
        }
     });
});
3
  • Convert one of the arrays into an id -> person map first? Commented Jan 14, 2016 at 19:42
  • Possible duplicate of Functional way of joining two js object arrays based on common id Commented Jan 14, 2016 at 19:57
  • Gruff Bunny's answer (linked above) is pretty comprehensive. Commented Jan 14, 2016 at 19:59

2 Answers 2

6

Since you're using lodash, you could use the _.find() method to find the corresponding object in array2 based on the id properties.

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

It's worth pointing out that this will result in an undefined person property if an object isn't found. If that's a problem, simply check to see if an object is returned:

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

Without lodash, it would be pretty similar:

array1.forEach(function(item1) {
    item1.person = array2.find(function (item2) {
      return item2.id === item1.id;
    });
});
Sign up to request clarification or add additional context in comments.

Comments

0

I would build a reference object and add to it, that way you're not loading the second array N times. Something like this:

    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];
        }
    }

This gives you an object with the properties of both arrays like:

    Object {2389: Object, 4356: Object, 7899: Object}

With the benefit that you only iterate over each array once.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.