Объединить два объекта карты и вернуть пользовательские объекты JavaScript - PullRequest
0 голосов
/ 05 июня 2018

У меня есть два массива

let a1 = [{id: 1, name: "terror"}, {id: 2, name: "comics"}, {id: 3, name: "suspense"}]
let a2 = [{id: 1, name: "terror"}, {id: 3, name: "suspense"}]

Мне нужно сравнить эти массивы друг с другом и получить что-то вроде этого: [{id: 1, name: "ror ", selected: true},{id: 2, name: "comics", selected: false}, {id: 3, name: "susse", selected: true}]

Я пытался использовать filter ниже, но это не такчто мне делать?

a2.filter(data => {
  return a1.find(value => {
    let x = data.id === value.id ? {
      id: value.id,
      text: value.name,
      selected: true
    } : {
      id: data.id,
      text: data.name,
      selected: false
    }
  })
})

1 Ответ

0 голосов
/ 05 июня 2018

Вы не должны использовать filter, потому что вам нужен выходной массив с тем же количеством элементов, с которого вы начали - вместо этого используйте map, чтобы создать новый массив с тем же количеством элементов, что и у исходного массива., только преобразованный.

Так как a2 не имеет никакой новой информации, он полезен только для демонстрации существования или отсутствия некоторых объектовметод с низкой сложностью будет иметь значение от map a2 до Set из id с, а затем генерировать новые объекты путем итерации по a1 и проверки, находятся ли их id в Set:

let a1 = [{id: 1, name: "terror"}, {id: 2, name: "comics"}, {id: 3, name: "suspense"}]
let a2 = [{id: 1, name: "terror"}, {id: 3, name: "suspense"}]
const a2IDs = new Set(a2.map(({ id }) => id));
const output = a1.map((item) => ({ ...item, selected: a2IDs.has(item.id) }));
console.log(output);

Можно исправить ваш код так, чтобы он работал, изменив .filter на .map и используя .find как есть, но это будетимеют большую сложность, потому что он должен будет перебирать элементы в a2 каждый раз (Set поисков для сравнения O(1)).

...