Как сравнить два массива объектов и удалить дубликаты в JavaScript? - PullRequest
0 голосов
/ 22 января 2020

В приведенном ниже коде при удалении объекта из массива checklist удаляются последние два, но если я изменяю порядок объектов и перемещаю последние два объекта в первые два места, тогда он работает нормально. Почему? Есть ли лучшее решение для удаления дубликатов из массива объектов?

const checklist = [
  { id: 1, value: "Elenor Anderson", isSelected: false },
  { id: 2, value: "Caden Kunze", isSelected: false },
  { id: 110, value: "Ms. Hortense Zulauf", isSelected: false },
  { id: 112, value: "Grady Reichert", isSelected: false }
];

const mainlist = [
  { id: 36, value: "Ms. Hortense Zulauf", isSelected: false },
  { id: 46, value: "Grady Reichert", isSelected: false },
  { id: 1, value: "Elenor Anderson", isSelected: false },
  { id: 2, value: "Caden Kunze", isSelected: false }
];

checklist.forEach(item => {
  var ItemIndex = mainlist.findIndex(b => b.id === item.id);
  console.log(ItemIndex);
  checklist.splice(ItemIndex, 1);
});

console.log(this.checklist);

1 Ответ

0 голосов
/ 22 января 2020

Вы можете использовать Array.prototype.filter.

const checklist = [ {id:1,value:'Elenor Anderson',isSelected:false}, {id:2,value:'Caden Kunze',isSelected:false}, {id:110,value:'Ms. Hortense Zulauf',isSelected:false}, {id:112,value:'Grady Reichert',isSelected:false}, ];
const mainlist = [ {id:36,value:'Ms. Hortense Zulauf',isSelected:false}, {id:46,value:'Grady Reichert',isSelected:false}, {id:1,value:'Elenor Anderson',isSelected:false}, {id:2,value:'Caden Kunze',isSelected:false} ];
const ids = mainlist.map(e => e.id);
let filtered = checklist.filter(e => ids.includes(e.id));
console.log(filtered)

Или может создать Set для O (n) сложности.

const ids =new Set(mainlist.map(e => e.id));
let filtered = checklist.filter(e => ids.has(e.id));
...