создание уникального массива в Javascript - PullRequest
0 голосов
/ 06 августа 2020

У меня проблемы с созданием массива, который содержит уникальное подмножество большего массива, пожалуйста, помогите!

Исходный массив allMembers (6)[{},{},{},{},{},{}]

allMembers Payload: 0:{id:1, name: Alex} 1:{id:2, name: James} 2:{id:3, name: Bob} 3:{id:4, name: lara} 4:{id:5, name: Dan} 5:{id:6, name: Jes}

Второй массив uniqueMembers (3)[{},{},{}]

 uniqueMembers Payload: 0:{id:1, name: Alex} 1:{id:2, name: James} 2:{id:3, name: Bob}`

то, что я ищу, - это найти пользователей, которые находятся в allMembers, но не в uniqueMembers, поэтому мой желаемый новый вывод массива будет следующим массив resultArray

resultArray (3)[{},{},{}]

resultArray Payload: 0:{id:4, name: lara} 1:{id:5, name: Dan} 2:{id:6, name: Jes}

Моя попытка

 for(let m=0; m<allMembers.length;m++)
        {
            console.log('Testing include statement', uniqueMembers.includes(allMembers[m])) //output always false 
                if(uniqueMembers.includes(allMembers[m]))
                {
                    console.log('ITS ALREADY IN: ', allMembers[m])
                }else{
                    this.setState((prevState) => ({
                        resultArray: [...prevState.resultArray, allMembers[m]] 
                    }));
                    console.log('ITS NOT IN: ', allMembers[m])
                }
        }// resultArray ends up the same as allMembers :( 

Любые отзывы о том, как я можно получить желаемые resultArray значения будут оценены!

Ответы [ 3 ]

1 голос
/ 06 августа 2020

Если ваш массив unique тоже очень большой, сначала преобразуйте массив unique в один набор, это сэкономит время l oop массиву unique для проверки совпадения.

Затем использует Array.filter для получения элементов not in unique.

let all = [{id:1, name: 'Alex'}, {id:2, name: 'James'},{id:3, name: 'Bob'},{id:4, name: 'lara'},{id:5, name: 'Dan'} ,{id:6, name: 'Jes'}]

let unique = [{id:2, name: 'James'},{id:3, name: 'Bob'}]

function getNotInUnique(src, target) {
  let uniqueSet = new Set(target.map(member => member.id))
  return src.filter(member => !uniqueSet.has(member.id))
}

console.log(getNotInUnique(all, unique))
1 голос
/ 06 августа 2020

Создайте ассоциативный массив для эффективного поиска, если член должен быть отфильтрован.

lookup = {}
for (const um uniqueMembers)
   lookup[um.id] = 1;

resultArray = allMembers.filter( mem => !lookup.hasOwnProperty(mem) );

Два решения, опубликованные после этого, предлагали использовать filter и some. Эти решения - O (N 2 ). Это должно быть O (N), что намного лучше.

0 голосов
/ 06 августа 2020

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

const allMembers = [
 {id:1, name: 'Alex'},{id:2, name: 'James'},{id:3, name: 'Bob'}, {id:4, name: 'lara'}, {id:5, name: 'Dan'}, {id:6, name: 'Jes'}
];
const uniqueMembers = [
 {id:1, name: 'Alex'},{id:2, name: 'James'},{id:3, name: 'Bob'}
];
const res = allMembers.filter(m => !uniqueMembers.some(({id})=>m.id===id));
console.log(res);
...