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

У меня есть объект объектов, и некоторые из этих объектов имеют похожие атрибуты (например, tempId), и их key получено из атрибута id объекта, как я могу удалить дубликаты (объектов с похожими tempId) оставив только тот, у которого установлен ключ id. Например, если у меня есть этот объект ниже:

{
 '' => { id: '', tempId: 'abcde', name: 'king', age: 5 },
 'aSaJsk' => { id: aSaJsk, tempId: 'abcde', name: 'king', age: 5 }
}

Я хотел бы вернуть:

{
 'aSaJsk' => { id: aSaJsk, name: 'king', age: 5 }
}

В данный момент я пытался использовать это, но он возвращает первый дубликат, чтобы появиться в объекте.

function removeDuplicates(myObj) {
  const obj = keyBy(uniqBy(Object.values(myObj), "tempId"), "id");
  const messages = Object.assign({}, obj);
  return messages;
}

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 09 апреля 2020

Вы можете сделать это, используя reduce и проверив, существует ли какое-либо дублирующее значение в аккумуляторе редуктора. Если он есть, пропустите его, иначе pu sh it.

Здесь я использую Object.entries() для преобразования объекта в массив, а также Object.fromEntries() для превращения массива в объект.

const data = {
 'sdkad': { id: 'sdkad', tempId: 'abcde', name: 'king', age: 5 },
 'aSaJsk': { id: 'aSaJsk', tempId: 'abcde', name: 'king', age: 5 },
 '4dkj': { id: '4dkj', tempId: 'cde', name: 'king', age: 5 },
};


const res = Object.fromEntries(Object.entries(data).reduce((res, [key, val]) => {
  if (!res.find(v => v[1].tempId === val.tempId)) {
     res.push([key, val]); 
  }
  return res;
}, []));

console.log(res);
0 голосов
/ 09 апреля 2020

Я не совсем уверен, если это то, что вы ищете.

const mainObject = {
            '': {
                id: '',
                tempId: 'abcde',
                name: 'king',
                age: 5
            },
            'aSaJsk': {
                id: 'aSaJsk',
                tempId: 'abcde',
                name: 'king',
                age: 5
            }
        };


Object.keys(mainObject).forEach(key => {
        if ('tempId' in mainObject[key] && !mainObject[key].id){
                delete mainObject[key];
        }
});

Этот код удалит все объекты, которые имеют tempId, но не id, я не уверен как бы вы хотели решить вашу проблему, если более двух объектов имеют одинаковый tempId, но только один из них не имеет id. Если вам нужны другие, кроме той, у которой нет идентификатора, этот ответ вам тоже пригодится.

Надеюсь, это немного вам помогло и вы можете более подробно прояснить вашу проблему, чтобы дать вам более совместимое решение.

...