Как я могу проверить, что массив объектов имеет повторяющиеся значения свойств с большим количеством свойств? - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть поиск по стеку и я нашел ответ , но не решил мою проблему. Моя проблема в том, что мой массив выглядит так:

let arr = [
{type: 1, id: 1, name:'aa'},
{type: 1, id: 1, name:'bb'},
{type: 2, id: 1, name:'cc'}
]

И мне нужно найти тот же type и тот же id, а затем распознать дублирующийся объект (arr [0] и arr [1] дублируются, но arr [0] и arr [2] нет), я пробовал с ES6 some(),every(), Set(), но не успешно, как я могу решить эту проблему? СПАСИБО !!!

Ответы [ 3 ]

3 голосов
/ 25 февраля 2020

Вы можете использовать .map(), чтобы отобразить каждый объект в строку. Каждая строка принимает форму type-id для этого объекта. Затем, используя Set, вы можете удалить все дублирующиеся строки. Затем вы можете проверить, равен ли установленный размер длине массива, чтобы определить, есть ли какие-либо дубликаты в массиве:

const containsDups = arr => new Set(arr.map(({type, id}) => `${type}-${id}`)).size !== arr.length;

const arr = [{type: 1, id: 1, name:'aa'},{type: 1, id: 1, name:'bb'},{type: 2, id: 1, name:'cc'}];
console.log(containsDups(arr));
0 голосов
/ 25 февраля 2020

Можно сгруппировать по таким свойствам, как type и id, а затем проверить, превышает ли names 1. Если да, это означает, что есть хотя бы один дубликат:

const result = [...arr.reduce((r, o) => {
    const key = o.type + '-' + o.id;
    const item = r.get(key) || Object.assign({}, o, {
        names: []
    });
    item.names.push(o.name);
    return r.set(key, item);
}, new Map).values()];

Пример:

let arr = [{type: 1, id: 1, name:'aa'},{type: 1, id: 1, name:'bb'},{type: 2, id: 1, name:'cc'}]

const result = [...arr.reduce((r, o) => {
    const key = o.type + '-' + o.id;
    const item = r.get(key) || Object.assign({}, o, {
        names: []
    });
    item.names.push(o.name);
    return r.set(key, item);
}, new Map).values()];

console.log(`Is there duplicates: `, result.some(s => s.names.length > 1));
0 голосов
/ 25 февраля 2020

вы можете использовать Set:

Set - новый объект данных, представленный в ES6. Потому что Set только позволяет хранить уникальные значения

const seen = new Set();

const arr = [
  {type: 1, id: 1, name:'aa'},
  {type: 1, id: 1, name:'bb'},
  {type: 2, id: 1, name:'cc'}
];

const filteredArr = arr.filter((el, index) => {
  const duplicate = seen.has(el.type, el.id);
  seen.add(el.type, el.id);
  console.log('index: '+ index +' is duplicate: '+ duplicate);
  return !duplicate;    //  if you just need a boolean, this is what you are looking for.
});

console.log('new array: ' + JSON.stringify(filteredArr));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...