Как сравнить два объекта массива в javascript, если они соответствуют, хотите обновить объект в array1? - PullRequest
0 голосов
/ 27 мая 2020

У меня есть два объекта массива, и я хочу сравнить их таким образом, чтобы, когда значение symbol в array1 совпадает с keyNumber в array2, установите соответствующее значение checked в array1 на true.

Я использую .map с обоими массивами, но не могу получить желаемый результат.

Это два моих массива: -

const array1 = [{
    symbol: '1',
    checked: false
  },
  {
    symbol: '2',
    alias: 'abc',
    checked: false
  },
  {
    symbol: '3',
    alias: 'def',
    checked: false
  }];

const array2= [{
  keyNumber: '1',
   type: 'number',
 },
 {
   keyNumber: '2',
   type: 'number'
  }];

Ниже приведен код чтобы получить обновленный массив:

 const array3 = array1.map(item => {
      return array2
        .map(key =>
          key.keyNumber === item.symbol
            ? { ...item, checked: true, type: key.type }
            : item
        )
        .reduce((obj, data) => data, {});
    });

console.log(array3);

Я получаю только результат, соответствующий последнему ключу, а не все.

 array3 = [{
    symbol: '1',
    checked: false
  },
  {
    symbol: '2',
    alias: 'abc',
    checked: true,
    type: 'number'
  },
  {
    symbol: '3',
    alias: 'def',
    checked: false
  }];

Ожидаемый результат:

array3 = [{
    symbol: '1',
    checked: true,
    type:'number'
  },
  {
    symbol: '2',
    alias: 'abc',
    checked: true,
    type: 'number'
  },
  {
    symbol: '3',
    alias: 'def',
    checked: false
  }];

Ответы [ 2 ]

3 голосов
/ 27 мая 2020

Здесь вы можете проверить мое решение.

const newArray = array1.map(obj1 => {
  const match = array2.find(obj2 => obj1.symbol === obj2.keyNumber);
  if(match) {
    obj1 = {...obj1, checked: true, type: match.type}
  }
  return obj1;

})

Вот полный рабочий код.

const array1 = [{
    symbol: '1',
    checked: false
  },
  {
    symbol: '2',
    alias: 'abc',
    checked: false
  },
  {
    symbol: '3',
    alias: 'def',
    checked: false
  }];

const array2= [{
  keyNumber: '1',
   type: 'number',
 },
 {
   keyNumber: '2',
   type: 'number'
  }];

const newArray = array1.map(obj1 => {
  const match = array2.find(obj2 => obj1.symbol === obj2.keyNumber);
  if(match) {
    obj1 = {...obj1, checked: true, type: match.type}
  }
  return obj1;
    
})


console.log(newArray)
0 голосов
/ 27 мая 2020

Вы также можете сделать это с помощью reduce, объединив второй массив с последним. В этом случае вам не нужно будет искать первый массив для каждого l oop.

var array1 = [{ symbol: '1', checked: false }, { symbol: '2', alias: 'abc', checked: false }, { symbol: '3', alias: 'def', checked: false }]; 
var array2= [{ keyNumber: '1', type: 'number', }, { keyNumber: '2', type: 'number' }];

array1 = [...array1, ...array2];

var result = Object.values(array1.reduce((acc, {symbol, keyNumber, ...rest})=>{
  data1 = symbol || keyNumber;
  acc[data1] = acc[data1] || {};
  if(symbol) acc[data1] = {symbol, ...rest};
  if(keyNumber) { acc[data1].type = rest.type, acc[data1].checked=true };
  return acc;
},{}));

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