Colin Sygiel
Colin Sygiel

Reputation: 947

How can I compare two arrays of objects and change a value for those that are found in both arrays?

Let's say I have two arrays of objects:

let array1 = [
          {
           id: 1,
           name: 'snow'
          },
          {
           id: 4,
           name: 'jo'
          },
          {
           id: 8,
           name: 'bran'
          },
          {
           id: 12,
           name: 'gondo'
          },
          {
           id: 13,
           name: 'peter'
          }
        ]

let array2 = [
      {
       id: 3,
       name: 'brim'
      },
      {
       id: 4,
       name: 'not-jo'
      },
      {
       id: 8,
       name: 'not-bran'
      },
      {
       id: 13,
       name: 'spleen'
      }
    ]

I want to find all the objects in array2 that match by id with array1, and change their name values to match the name values in array1.

In my pseudocode:

array1.forEach((person)=> {
 if(person.id is equal to person.id in array2){
   person.name = person.name in array1
 }
})

Upvotes: 7

Views: 19724

Answers (5)

array2.filter(o => array1.find(o2 => o.id === o2.id))

Upvotes: -1

huydq5000
huydq5000

Reputation: 284

You can do something like that

var idDict = {};//a dictionary to lookup array1 id
for(var idx=0;idx<array1.length;idx++) {
    idDict[array1[idx].id] = array1[idx].name;
}
for(var idx=0;idx<array2.length;idx++) {
   if (idDict[array2[idx].id]) {
        array2[idx].name = idDict[array2[idx].id];
   }
}

Upvotes: 0

Nina Scholz
Nina Scholz

Reputation: 386600

You could use a Map and store the reference to each id and then update array2.

let array1 = [{ id: 1, name: 'snow' }, { id: 4, name: 'jo' }, { id: 8, name: 'bran' }, { id: 12, name: 'gondo' }, { id: 13, name: 'peter' }],
    array2 = [{ id: 3, name: 'brim' }, { id: 4, name: 'not-jo' }, { id: 8, name: 'not-bran' }, { id: 13, name: 'spleen' }],
    map = new Map(array1.map(o => [o.id, o]));

array2.forEach(o => map.has(o.id) && (o.name = map.get(o.id).name));

console.log(array2);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Upvotes: 1

Jaydip Jadhav
Jaydip Jadhav

Reputation: 12309

Try this :

array2.map(function(x){ 
       var result=array1.filter(a1=> a1.id==x.id);
       if(result.length>0) { x.name=result[0].name;}
       return x })

Upvotes: 16

Alexander Higgins
Alexander Higgins

Reputation: 6923

Loop through each element and compare there ids. If they match update the name:

for (var i = 0; i < array2.length; i++) {
  for (var k = 0; k < array1.length; k++) {
    if (array2[i].id == array1[k].id) {
      array2[i].name = array1[k].name;
      break;
    }
  }
}

Try it:

let array1 = [{
    id: 1,
    name: 'snow'
  },
  {
    id: 4,
    name: 'jo'
  },
  {
    id: 8,
    name: 'bran'
  },
  {
    id: 12,
    name: 'gondo'
  },
  {
    id: 13,
    name: 'peter'
  }
]

let array2 = [{
    id: 3,
    name: 'brim'
  },
  {
    id: 4,
    name: 'not-jo'
  },
  {
    id: 8,
    name: 'not-bran'
  },
  {
    id: 13,
    name: 'spleen'
  }
]
console.log(array2);
for (var i = 0; i < array2.length; i++) {
  for (var k = 0; k < array1.length; k++) {
    if (array2[i].id == array1[k].id) {
      array2[i].name = array1[k].name;
      break;
    }
  }
}
console.log(array2);

Upvotes: 2

Related Questions