@jizzy

Как вложенные массивы объединить в один при совпадении id в родительских объектах?

Есть массив:

array   : [     {
                "name": "test",
                "id": "1",
                "array1": [
                    {
                        "name": "Jack",
                        "id": "123",
                    }
                ]
            },
            {
                "name": "test",
                "id": "1",
                "array1": [
                    {
                        "name": "Igor",
                        "id": "985",
                    }
                ]
            }
]

Надо сделать его таким:

array   : [     {
                "name": "test",
                "id": "1",
                "array1": [
                    {
                        "name": "Jack",
                        "id": "123",
                    },
                    {
                        "name": "Igor",
                        "id": "985",
                    }
                ]
            }
]
  • Вопрос задан
  • 152 просмотра
Решения вопроса 2
0xD34F
@0xD34F Куратор тега JavaScript
const groupSubarrays = (arr, idKey, subarrKey) =>
  Object.values(arr.reduce((acc, n) => (
    (acc[n[idKey]] ??= { ...n, [subarrKey]: [] })[subarrKey].push(...n[subarrKey]),
    acc
  ), {}));


const result = groupSubarrays(arr, 'id', 'array1');
Ответ написан
Комментировать
@dimoff66
Кратко о себе: Я есть
const mapIds = {}
const filtered = array.filter(elem => {
  const existingElement = mapIds[elem.id]
  if (!existingElement) 
    mapIds[elem.id] = elem
  else  
    existingElement.array1.push(...elem.array1)

  return !existingElement
})


Либо если выпендриться с filter в одну строчку, то

const mapIds = {}
const filtered = array.filter(elem => 
  (!mapIds[elem.id] && (mapIds[elem.id] = elem)) || !mapIds[elem.id].array1.push(...elem.array1)
)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы