Как получить уникальные объекты из массива объектов по всем свойствам? - PullRequest
0 голосов
/ 07 июня 2018

Учитывая этот машинописный код с использованием lodash:

import * as _ from "lodash/fp";

const range = _.range(0, 1000);
let objects = _.uniq(range.map((i) => {
    let foo = "foo";
    let bar = "bar";

    if (i < 5) {
        foo += i.toString(10);
    }

    if (i > 995) {
        bar += i.toString(10);
    }

    return {
        foo,
        bar,
    };
}));

Я ожидал увидеть объект

{
    "foo": "foo",
    "bar": "bar"
}

один раз и всего 10 элементов с uniq bar и foo strings.

Ожидаемый результат:

[
    {
        "foo": "foo0",
        "bar": "bar"
    },
    {
        "foo": "foo1",
        "bar": "bar"
    },
    {
        "foo": "foo2",
        "bar": "bar"
    },
    {
        "foo": "foo3",
        "bar": "bar"
    },
    {
        "foo": "foo4",
        "bar": "bar"
    },
    {
        "foo": "foo",
        "bar": "bar"
    },
    {
        "foo": "foo",
        "bar": "bar996"
    },
    {
        "foo": "foo",
        "bar": "bar997"
    },
    {
        "foo": "foo",
        "bar": "bar998"
    },
    {
        "foo": "foo",
        "bar": "bar999"
    }
]

В действительности, я вижу все элементы, которые должны быть сохранены в списке.Как будто _.uniq ничего не делает.

Я хочу получить уникальный список массива, основанный на идентичности / равных.Все дубликаты массивов для всех комбинаций свойств должны быть удалены.

Как этого добиться?

1 Ответ

0 голосов
/ 07 июня 2018

Когда вам нужна уникальность для объекта, вы можете использовать _.uniqWith:

const withoutDupes = _.uniqWith(_.isEqual, objects);
console.log(
    JSON.stringify(withoutDupes, null, 4),
);

Что касается вашей первой аппроксимации, имейте в виду, что _.uniq не работает наколлекция объектов, но работает только для простых массивов, например:

const simpleArray = [1, 1, 1, 1, 2, 3];
console.log(_.uniq(simpleArray));

output:

[ 1, 2, 3 ]
...