Как можно объединить два массива в один, не используя два цикла forEach?

Добрый день! Можете подсказать, как объединить два массива объектов в один на основе поля "id"? Вот пример первого массива: <br/> <pre><code class="javascript">[{
        "id": 3231,
        "stage": 3,
        "sort": 999
}]</code></pre> <br/> Второй массив выглядит так: <br/> <pre><code class="javascript">[{
        "id": 3231,
        "status_client": 3,
        "status_date": "2024-11-22 16:18:58",
        "sort": 999
}]</code></pre> <br/> <br/> Я понимаю, что в каждом массиве содержится более 500 объектов.
  • 26 ноября 2024 г. 14:13
Ответы на вопрос 3
Для объединения двух массивов объектов на основе общего поля, например, `id`, можно использовать методы массива, такие как `reduce` и `map`, чтобы избежать использования двух циклов `forEach`. Предлагаю следующий подход:

1. Преобразуйте второй массив в объект, где ключом будет `id`, а значением — объект. Это позволит быстро находить соответствующий элемент по `id`.
2. Пройдите по первому массиву, находите соответствующие объекты из второго массива и объединяете их.

Вот пример кода, который выполняет описанные шаги:

```javascript
const array1 = [{
    "id": 3231,
    "stage": 3,
    "sort": 999
}];

const array2 = [{
    "id": 3231,
    "status_client": 3,
    "status_date": "2024-11-22 16:18:58",
    "sort": 999
}];

// Преобразуем второй массив в объект для быстрого поиска по id:
const map2 = array2.reduce((acc, obj) => {
    acc[obj.id] = obj;
    return acc;
}, {});

// Объединяем массивы:
const combinedArray = array1.map(obj1 => {
    const obj2 = map2[obj1.id];
    return obj2 ? { ...obj1, ...obj2 } : obj1;
});

console.log(combinedArray);
```

### Как это работает:
1. В `reduce` мы перебираем второй массив `array2` и создаем объект `map2`, где ключами являются `id`, а значениями — сами объекты из `array2`.
2. Затем с помощью `map` мы перебираем массив `array1`. Для каждого объекта мы ищем его соответствие в `map2` с помощью `obj2 = map2[obj1.id]`.
3. Если соответствие найдено, мы объединяем объекты с помощью оператора расширения `...`. Если соответствие не найдено, оставляем объект из первого массива без изменений.

Этот подход эффективен, так как использует всего два прохода по массивам, что делает его оптимальным даже для больших массивов.
Вы вкладки перепутали, наверное. Поисковая система в <a href="https://yandex.ru/search/?text=js+%D0%BE%D0%B1%D1%8A%D0%B5%D0%B4%D0%B8%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5+%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0&amp;clid=2411726&amp;lr=15" rel="nofollow">соседней вкладке</a>
<pre><code class="javascript">const array1 = [{
    'id': 3231,
    'stage': 3,
    'sort': 999,
}];

const array2 = [{
    'id': 3231,
    'status_client': 3,
    'status_date': '2024-11-22 16:18:58',
    'sort': 999,
}];

const map = new Map(array2.map((item) =&gt; [item.id, item]));

const reduced = array1.reduce((acc, item) =&gt; {
    const _item = map.get(item.id);

    _item
        ? acc.push({..._item, ...item})
        : acc.push(item);

    return acc;
}, []);

console.log(reduced);

// [
//   {
//     id: 3231,
//     status_client: 3,
//     status_date: '2024-11-22 16:18:58',
//     sort: 999,
//     stage: 3
//   }
// ]</code></pre>
Похожие вопросы