Удалить дубликаты из массива объектов в JavaScript - PullRequest
260 голосов
/ 08 февраля 2010

У меня есть объект, который содержит массив объектов.

things = new Object();

things.thing = new Array();

things.thing.push({place:"here",name:"stuff"});
things.thing.push({place:"there",name:"morestuff"});
things.thing.push({place:"there",name:"morestuff"});

Мне интересно, как лучше всего удалять дубликаты объектов из массива. Так, например, вещи стали бы ...

{place:"here",name:"stuff"},
{place:"there",name:"morestuff"}

Ответы [ 46 ]

0 голосов
/ 19 апреля 2019

Вы можете преобразовать объекты массива в строки, чтобы их можно было сравнивать, добавить строки в набор, чтобы сопоставимые дубликаты были автоматически удалены, а затем преобразовать каждую строку обратно в объекты.

Возможно, он не так эффективен, как другие ответы, но читабелен.

const things = {};

things.thing = [];
things.thing.push({place:"here",name:"stuff"});
things.thing.push({place:"there",name:"morestuff"});
things.thing.push({place:"there",name:"morestuff"});

const uniqueArray = (arr) => {

  const stringifiedArray = arr.map((item) => JSON.stringify(item));
  const set = new Set(stringifiedArray);

  return Array.from(set).map((item) => JSON.parse(item));
}

const uniqueThings = uniqueArray(things.thing);

console.log(uniqueThings);
0 голосов
/ 07 февраля 2019

es6 магия в одной строке ... при этом читаемо!

// returns the union of two arrays where duplicate objects with the same 'prop' are removed
const removeDuplicatesWith = (a, b, prop) => a.filter(x => !b.find(y => x[prop] === y[prop]);
0 голосов
/ 10 мая 2019

Простое решение с ES6 вспомогательными методами «уменьшить» и «найти» массива

Работает эффективно и безупречно!

"use strict";

var things = new Object();
things.thing = new Array();
things.thing.push({
    place: "here",
    name: "stuff"
});
things.thing.push({
    place: "there",
    name: "morestuff"
});
things.thing.push({
    place: "there",
    name: "morestuff"
});

// the logic is here

function removeDup(something) {
    return something.thing.reduce(function (prev, ele) {
        var found = prev.find(function (fele) {
            return ele.place === fele.place && ele.name === fele.name;
        });
        if (!found) {
            prev.push(ele);
        }
        return prev;
    }, []);
}
console.log(removeDup(things));
0 голосов
/ 13 февраля 2019

вот мое решение: оно ищет дубликаты на основе object.prop, а когда находит дубликат объекта, оно replaces its value в массиве1 with array2 value

function mergeSecondArrayIntoFirstArrayByProperty(array1, array2) {
    for (var i = 0; i < array2.length; i++) {
        var found = false;
        for (var j = 0; j < array1.length; j++) {
            if (array2[i].prop === array1[j].prop) { // if item exist in array1
                array1[j] = array2[i]; // replace it in array1 with array2 value
                found = true;
            }
        }
        if (!found) // if item in array2 not found in array1, add it to array1
            array1.push(array2[i]);

    }
    return array1;
}
0 голосов
/ 24 февраля 2016

Вот еще один способ найти номер дубликата и легко удалить его из объекта данных. «dupsCount» - количество дубликатов файлов. сначала отсортируйте данные, а затем удалите. это даст вам самое быстрое удаление дубликатов.

  dataArray.sort(function (a, b) {
            var textA = a.name.toUpperCase();
            var textB = b.name.toUpperCase();
            return (textA < textB) ? -1 : (textA > textB) ? 1 : 0;
        });
        for (var i = 0; i < dataArray.length - 1; ) {
            if (dataArray[i].name == dataArray[i + 1].name) {
                dupsCount++;
                dataArray.splice(i, 1);
            } else {
                i++;
            }
        }
0 голосов
/ 09 января 2018

Это простой способ, как убрать двуличие из массива объектов.

Я много работаю с данными, и это полезно для меня.

const data = [{name: 'AAA'}, {name: 'AAA'}, {name: 'BBB'}, {name: 'AAA'}];
function removeDuplicity(datas){
    return datas.filter((item, index,arr)=>{
    const c = arr.map(item=> item.name);
    return  index === c.indexOf(item.name)
  })
}

console.log(removeDuplicity(data))

выведет на консоль:

[[object Object] {
name: "AAA"
}, [object Object] {
name: "BBB"
}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...