@melishev

Как вытащить уникальные данные из массива объектов?

Есть объект:

{
    "id": 1,
    "name": "Тест",
    "popularity": 4,
    "published_at": "2021-07-22T20:18:08.000Z",
    "created_at": "2021-07-11T23:33:52.000Z",
    "updated_at": "2021-07-22T20:19:37.000Z",
    "slug": "test",
    "price": 3000,
    "sale": 2000,
    "variations": [
        {
            "id": 1,
            "color": {
                "id": 1,
                "name": "Черный",
                "slug": "chernyj",
                "published_at": "2021-07-22T20:00:25.000Z",
                "created_at": "2021-07-22T20:00:24.000Z",
                "updated_at": "2021-07-22T20:00:26.000Z"
            },
            "size": {
                "id": 2,
                "name": "M",
                "slug": "m",
                "published_at": "2021-07-22T20:00:01.000Z",
                "created_at": "2021-07-22T19:59:59.000Z",
                "updated_at": "2021-07-22T20:00:01.000Z"
            }
        },
        {
            "id": 2,
            "color": {
                "id": 3,
                "name": "Белый",
                "slug": "belyj",
                "published_at": "2021-07-22T20:00:43.000Z",
                "created_at": "2021-07-22T20:00:42.000Z",
                "updated_at": "2021-07-22T20:00:43.000Z"
            },
            "size": {
                "id": 2,
                "name": "M",
                "slug": "m",
                "published_at": "2021-07-22T20:00:01.000Z",
                "created_at": "2021-07-22T19:59:59.000Z",
                "updated_at": "2021-07-22T20:00:01.000Z"
            }
        }
    ],
}

Как из него получить массив уникальных цветов (объекты COLOR в VARIATIONS)?
  • Вопрос задан
  • 145 просмотров
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
В каком виде надо получить цвета? Если нужны строки (значения свойства name), то

[...new Set(data.variations.map(n => n.color.name))]

Если же нужны сами объекты, тогда

Object.values(Object.fromEntries(data.variations.map(n => [ n.color.name, n.color ])))

// или

Object.values(data.variations.reduce((acc, { color: n }) => (acc[n.name] ??= n, acc), {}))

// или

data.variations.map(n => n.color).filter(function(n) {
  return !(this[n.name] = this.hasOwnProperty(n.name));
}, {})

Можно решить задачу и в более общем виде - сделаем функцию, параметрами которой будут массивоподобный объект (помимо массивов можно будет уникализировать строки, NodeList'ы и т.п.) и функция, принимающая его элемент и возвращающая значение, по которому осуществляется уникализация:

const unique = (data, key = n => n) =>
  Array.prototype.filter.call(data, function(n) {
    const k = key(n);
    return !this.has(k) && this.add(k);
  }, new Set);


// получаем массив уникальных имён цветов
const uniqueStrColors = unique(data.variations.map(n => n.color.name));

// получаем массив объектов цветов, свойства name которых уникальны
const uniqueObjColors = unique(data.variations.map(n => n.color), n => n.name);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы