Как сформировать массив объектов исходя из 2-х других массивов объектов?

Ссылка скопирована
1 ответ

Есть 2 массива объектов.
Первый (данные пришли с бека):

[     {         "id": 55,         "name": "region",         "value": "1",     },     {         "id": 56,         "name": "age",         "value": "2",     } ]

[ { "id": 55, "name": "region", "value": "1", }, { "id": 56, "name": "age", "value": "2", } ]

Второй (данные которые мы добавили или изменили на клиенте):

[     {         "name": "range",         "value": "Год"     },     {         "name": "region",         "value": "11"     },     {         "name": "age",         "value": "22"     } ]

[ { "name": "range", "value": "Год" }, { "name": "region", "value": "11" }, { "name": "age", "value": "22" } ]

Нужно дополнить второй массив объектов, данными (добавить параметр ID объекту) из первого, чтобы получилось так:

[     {         "name": "range",         "value": "Год"     },     {         "id": 55,         "name": "region",         "value": "11"     },     {         "id": 56,         "name": "age",         "value": "22"     } ]

[ { "name": "range", "value": "Год" }, { "id": 55, "name": "region", "value": "11" }, { "id": 56, "name": "age", "value": "22" } ]

Дополнительно:

Сначала из первого массива сделаем объект, где значениями будут его элементы, а ключами - значения их, элементов, свойства name:

const obj1 = Object.fromEntries(arr1.map(n => [ n.name, n ]));

const obj1 = Object.fromEntries(arr1.map(n => [ n.name, n ]));

Затем можно собрать новый массив:

const newArr2 = arr2.map(n => ({ ...obj1[n.name], ...n }));

const newArr2 = arr2.map(n => ({ ...obj1[n.name], ...n }));

Или обновить существующий:

arr2.forEach(n => {   const obj = obj1[n.name];   if (obj) {     n.id = obj.id;   } });

arr2.forEach(n => { const obj = obj1[n.name]; if (obj) { n.id = obj.id; } });

UPD. Вынесено из комментариев:

можно ли исключить объекты у которых не изменился value? То есть что бы этих объектов не было в итоговом массиве.

const newArr2 = arr2.reduce((acc, n) => (   obj1[n.name]?.value !== n.value && acc.push({ ...obj1[n.name], ...n }),   acc ), []);

const newArr2 = arr2.reduce((acc, n) => ( obj1[n.name]?.value !== n.value && acc.push({ ...obj1[n.name], ...n }), acc ), []);

  • Такие конструкции я точно не придумал бы)
    Вопрос, можно ли исключить объекты у которых не изменился value? То есть что бы этих объектов не было в итоговом массиве.
  • Дополнил ответ.
  • 0xD34F, Что то не то получается, и id пропали
  • Ну а у меня всё получается. И ничего не пропадает.
  • 0xD34F, Ага, разобрался. То что нужно, спасибо!)

Ответы:

Есть ещё вариант:

const combinedArray = [     ...array2,     ...array1.filter(a1 => !array2.some(a2 => a2.name === a1.name)) ].map(obj => ({     ...obj,     ...(array1.find(a1 => a1.name === obj.name) || {}) }));

const combinedArray = [ ...array2, ...array1.filter(a1 => !array2.some(a2 => a2.name === a1.name)) ].map(obj => ({ ...obj, ...(array1.find(a1 => a1.name === obj.name) || {}) }));

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Юрий Linux Ответ

Для формирования массива объектов из двух других массивов объектов вам необходимо пройти по каждому массиву, извлечь нужные данные и создать новые объекты.

Вот пример кода на языке PHP, который поможет вам решить данную задачу:

// Исходные массивы объектов
$array1 = [
    (object)['id' => 1, 'name' => 'John'],
    (object)['id' => 2, 'name' => 'Alice']
];
 
$array2 = [
    (object)['id' => 1, 'age' => 25],
    (object)['id' => 2, 'age' => 30]
];
 
// Массив для хранения новых объектов
$newArray = [];
 
// Проходим по первому массиву объектов
foreach ($array1 as $obj1) {
    // Находим соответствующий объект во втором массиве
    foreach ($array2 as $obj2) {
        if ($obj1->id == $obj2->id) {
            // Создаем новый объект и добавляем его в массив
            $newArray[] = (object)[
                'id' => $obj1->id,
                'name' => $obj1->name,
                'age' => $obj2->age
            ];
            break;
        }
    }
}
 
// Выводим результат
var_dump($newArray);

// Исходные массивы объектов $array1 = [ (object)['id' => 1, 'name' => 'John'], (object)['id' => 2, 'name' => 'Alice'] ]; $array2 = [ (object)['id' => 1, 'age' => 25], (object)['id' => 2, 'age' => 30] ]; // Массив для хранения новых объектов $newArray = []; // Проходим по первому массиву объектов foreach ($array1 as $obj1) { // Находим соответствующий объект во втором массиве foreach ($array2 as $obj2) { if ($obj1->id == $obj2->id) { // Создаем новый объект и добавляем его в массив $newArray[] = (object)[ 'id' => $obj1->id, 'name' => $obj1->name, 'age' => $obj2->age ]; break; } } } // Выводим результат var_dump($newArray);

В этом коде мы проходим по каждому объекту из первого массива, затем ищем соответствующий объект во втором массиве по полю 'id'. Если находим соответствие, создаем новый объект с необходимыми полями и добавляем его в итоговый массив объектов. В результате получаем массив новых объектов, сформированный из двух исходных массивов.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно