Удаление Дубликатов из массива объекта и объединение его Subarray в один - PullRequest
0 голосов
/ 10 января 2020

У меня есть массив объектов с индексом данных в качестве подмассива в нем. Массив объектов возвращает повторяющиеся значения. Поэтому мне нужно сгруппировать его таким образом, чтобы он содержал поле «Весь ключ» со всеми данными, объединенными в Индекс данных этого массива.

Вот пример кода, который я получаю:

"Todo": [
        {
            "AreaId": 4,
            "AreaName": "Hall",
            "Sequence": 3,
            "Data": [
                {
                    "AssetId": 2,
                    Some OtherFields,

                }
            ]
        },
        {
            "AreaId": 4,
            "AreaName": "Hall",
            "Sequence": 3,
            "Data": [
                {
                    "AssetId": 3,
                     Some OtherFields,
                }
            ]
        },


        {
                "AreaId": 2,
                "AreaName": "Hall",
                "Sequence": 1,
                "Data": [
                    {
                        "AssetId": 4,
                        Some OtherFields,

                    }
                ]
            },
            {
                "AreaId": 2,
                "AreaName": "Hall",
                "Sequence": 1,
                "Data": [
                    {
                        "AssetId": 3,
                         Some OtherFields,
                    }
                ]
            }

]

Я хочу, чтобы этот вывод был таким, как указано ниже:

 "Todo": [
            {
                "AreaId": 4,
                "AreaName": "Hall",
                "Sequence": 3,
                "Data": [
                    {
                        "AssetId": 2,
                         Some OtherFields,
                    },
                    {
                        "AssetId": 3,
                        Some OtherFields,
                    }

                ]
            },




       {
            "AreaId": 2,
            "AreaName": "Hall",
            "Sequence": 3,
            "Data": [
                {
                    "AssetId": 4,
                     Some OtherFields,
                },
                {
                    "AssetId": 3,
                    Some OtherFields,
                }

            ]
        }
]

1 Ответ

0 голосов
/ 10 января 2020

Вы можете использовать уменьшить для объединения объектов:

Здесь мы группируем по AreaId, AreaName и Sequence, точнее мы используем все другие свойства, кроме Data для группировки объекты.

Например:

const data = { "Todo": [ { "AreaId": 4, "AreaName": "Hall", "Sequence": 3, "Data": [ { "AssetId": 2, "SomeOtherField1": "Value1", "SomeOtherField2": "Value2" } ] }, { "AreaId": 4, "AreaName": "Hall", "Sequence": 3, "Data": [ { "AssetId": 3, "SomeOtherField1": "Value1", "SomeOtherField2": "Value2" } ] }, { "AreaId": 2, "AreaName": "Hall", "Sequence": 1, "Data": [ { "AssetId": 4, "SomeOtherField1": "Value1", "SomeOtherField2": "Value2" } ] }, { "AreaId": 2, "AreaName": "Hall", "Sequence": 1, "Data": [ { "AssetId": 3, "SomeOtherField1": "Value1", "SomeOtherField2": "Value2" } ] } ] }; 

// Let's do a reduce here..
const result = { Todo: Object.values(data.Todo.reduce((acc, elem ) => {
    // Create a key based on AreaId
    const key = elem.AreaId;
    if (!acc[key]) { 
        acc[key] = { ...elem };
        acc[key].Data = [];
    }
    acc[key].Data = [...(acc[key].Data || []), elem.Data];
    return acc;
}, {}))};

console.log("Result:", result);
...