Сравните два массива объектов и присвойте значение - PullRequest
0 голосов
/ 08 апреля 2019

У меня есть два массива объектов:

 let arr1 = [{id: 100, quantity: 2, grp: 1A},{...},{...}, ...],

 let arr2 = [{id: 100, color: "#000"},{...},{...}, ...],    

arr2 содержит объекты с идентификатором и цветом для каждого объекта из arr1.

У меня вопрос: как я могу пройти через оба массива объектов и добавить свойство цвета arr2 к соответствующему объекту в arr1?

Ответы [ 4 ]

1 голос
/ 08 апреля 2019

Если вы не хотите искать по arr1 для каждого элемента arr2 (решение O (n²)), вы можете создать поисковый объект для arr1 с ключом id.Затем вы можете просто выполнить цикл arr2, объединяя найденный объект, просматривая его.Это будет более эффективно, если у вас есть большие массивы.

let arr1 = [{id: 100, quantity: 2, grp: '1A'},{id: 101, quantity: 2, grp: '2A'}]
let arr2 = [{id: 101, color: "#FFF"}, {id: 100, color: "#000"}] 

// make lookup
let lookup = arr1.reduce((lookup, item) => lookup.set(item.id, item), new Map)

// assign color to correct object
arr2.forEach(({id, ...rest}) => Object.assign(lookup.get(id), rest))
console.log(arr1)
1 голос
/ 08 апреля 2019

Используйте forEach для цикла arr1, а внутри этой функции используйте filter, чтобы найти элемент arr2, который соответствует текущему элементу в arr1:

arr1.forEach(item=>item.color = arr2.filter(colorObj=>colorObj.id===item.id)[0].color)

Или, чуть более наглядно:

arr1.forEach(item=>{
    var matchingColorObj = arr2.filter(colorObj=>colorObj.id===item.id)[0];
    item.color = matchingColorObj.color;
});
0 голосов
/ 11 апреля 2019
let arr1 = [{id: 100, quantity: 2, grp: 1A},{...},{...}, ...],

let arr2 = [{id: 100, color: "#000"},{...},{...}, ...],   

Сначала создайте справочную карту из arr2, а затем используйте .map() на arr1 для назначения значений из справочной таблицы.

let lookupMap = new Map();
arr2.forEach((val,key)=>{
  lookupMap.set(val.id, val.color);
});

let mappedArray = arr1.map((obj)=> {
  let color = lookupMap.get(obj.id);
  return {...obj, color }
});

// mapped Array would be as 
//[ { id: 100, quantity: 2, grp: '1A', color: '#000' },
// {...},{...} ]

0 голосов
/ 08 апреля 2019

Может быть, вы можете сделать что-то вроде этого

    let arr1 = [{
      id: 100,
      quantity: 2,
      grp: 1 A
    }];

    let arr2 = [{
      id: 100,
      color: "#000"
    }];

    arr2.forEach(obj => {

      arr1.find(arr1_element => arr1_element.id == obj.id).color = obj.color;
    });

    console.log(arr1, arr2);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...