Есть ли способ «объединить» два объекта, которые находятся внутри массива? - PullRequest
3 голосов
/ 10 ноября 2019

У меня есть два массива, которые я хочу два слияния, что-то вроде этого:

const arr1 = [{
    id: 1,
    isAvailable: true
  },
  {
    id: 2,
    isAvailable: true
  },
  {
    id: 4,
    isAvailable: true
  },
  {
    id: 6,
    isAvailable: false
  }
]

const arr2 = [{
    id: 1,
    isAvailable: false
  },
  {
    id: 2,
    isAvailable: false
  },
  {
    id: 6,
    isAvailable: false
  }
]

Результат, который я ищу, примерно такой:

const arr3 = [{
    id: 1,
    isAvailable: false
  },
  {
    id: 2,
    isAvailable: false
  },
  {
    id: 4,
    isAvailable: true
  },
  {
    id: 6,
    isAvailable: false
  }
]

Мне нужнообновите значения первого массива значениями второго массива, чтобы я мог получить новый массив с тем, что действительно доступно, а что нет.

Ответы [ 4 ]

2 голосов
/ 10 ноября 2019

Вы можете сначала преобразовать arr2 в объект карты, который сопоставляет идентификаторы с их доступностью, что-то вроде { "1": true, "4": false, ... }. Затем сопоставьте arr1 объекты в новый массив объектов при обновлении свойства isAvailable, используя объект карты:

let map = arr2.reduce((acc, o) => (acc[o.id] = o.isAvailable, acc), {});

let arr3 = arr1.map(o => ({
  id: o.id,
  isAvailable: map.hasOwnProperty(o.id) ? map[o.id] : o.isAvailable
}));

Каждый новый объект будет иметь тот же идентификатор, что и исходный. Его свойство isAvailable будет либо значением из объекта карты, либо его первоначальным значением в зависимости от того, есть ли у него запись в объекте карты (независимо от того, есть ли у него объект в arr2)

0 голосов
/ 10 ноября 2019

Вот мой пример программы по вашему примеру. Надеюсь, это решит вашу проблему

const arr1 = [{
    id: 1,
    isAvailable: true
  },
  {
    id: 2,
    isAvailable: true
  },
  {
    id: 4,
    isAvailable: true
  },
  {
    id: 6,
    isAvailable: true
  }
]

const arr2 = [{
    id: 1,
    isAvailable: false
  },
  {
    id: 2,
    isAvailable: false
  },
  {
    id: 6,
    isAvailable: false
  }
]
const arr3 = []
for (let i = 0; i < arr1.length; i++) {
  let found = arr2.find(item => item.id === arr1[i].id)
  if (found)
    arr3.push(found)
  else
    arr3.push(arr1[i])
}
console.log(arr3)

Вывод
[ { id: 1, isAvailable: false }, { id: 2, isAvailable: false }, { id: 4, isAvailable: true }, { id: 6, isAvailable: false } ]

0 голосов
/ 10 ноября 2019

Вы можете фильтровать arr1 на основе arr2, а затем просто объединить фильтрованный arr2 с arr1

const arr1 = [{
  id: 1,  isAvailable: true
},
{
  id: 2,  isAvailable: true
},
{
  id: 4,  isAvailable: true
},
{
  id: 6,  isAvailable: false
}
];

const arr2 = [{
  id: 1,  isAvailable: false
},
{
  id: 2,  isAvailable: false
},
{
  id: 6,  isAvailable: false
}
];

const result = arr1.filter(a => !arr2.some(s => s.id == a.id)).concat(arr2);
console.log(result);

Или с использованием методов map, some и find:

const arr1 = [{
  id: 1, isAvailable: true
},
{
  id: 2, isAvailable: true
},
{
  id: 4, isAvailable: true
},
{
  id: 6,
  isAvailable: false
}
];

const arr2 = [{
  id: 1, isAvailable: false
},
{
  id: 2, isAvailable: false
},
{
  id: 6, isAvailable: false
}
];
const result = arr1.map(a=> arr2.some(f=> f.id == a.id) ? 
                            arr2.find(f=> f.id == a.id) : a 
                        );
console.log(result);
0 голосов
/ 10 ноября 2019

Вы можете сделать это с помощью Array.map(), перезаписав значение, если оно существует во втором массиве.

const newArray = arr1.map(({ id, isAvailable}) => {
  const matchingObjects = arr2.filter(({ id: id2 }) => id === id2);
  return matchingObjects.length > 0
    ? { id, isAvailable: matchingObjects[0].isAvailable } // replace the original value
    : { id, isAvailable } // do not overwrite this value
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...