объединение двух массивов с одинаковым полем в node js - PullRequest
1 голос
/ 26 февраля 2020

У меня есть подобные массивы

arr1 = [{
    "_id": 1,
    "item": "Pencil",
    "color": "Red"
  },{
    "_id":2,
    "item": "Pen",
    "color": "Yellow"
  },{
    "_id": 3,
    "item": "Pencil",
    "color": "Green"
}]

arr2 = [{
    "value":"Pencil",
    "price":1000,
 },{
    "value":"Pen",
    "price":1500,
 }]

Как мне объединить этот arr2 в arr1 со значением "value" в arr2 и "price" в arr1 в качестве ключа? так что он имеет следующие результаты

res = [{
        "_id": 1,
        "item": "Pencil",
        "color": "Red",
        "price": 1000
      },{
        "_id":2,
        "item": "Pen",
        "color": "Yellow",
        "price": 1500
      },{
        "_id": 3,
        "item": "Pencil",
        "color": "Green",
        "price": 1000
    }]

Ответы [ 2 ]

2 голосов
/ 26 февраля 2020

Вы можете использовать map. Например:

let arr3 = arr1.map((el1) => {
    let found = arr2.find(el2 => el1.item == el2.value)
    if (found)
        el1.price = found.price
    return el1
})

console.log(arr3)
1 голос
/ 26 февраля 2020

Вы можете использовать Map collection, чтобы иметь O(1) при отображении второго массива:

const uniquePencils = new Map(arr2.map(s => [s.value, s.price]));
const result = arr1.map(a => ({...a, price: uniquePencils.get(a.item)}));

Как mdn говорит о коллекции Map :

Объект Map содержит пары ключ-значение и запоминает исходный порядок вставки ключей.

Таким образом, чтобы создать коллекцию карт из массива, мы можем использовать метод map :

const uniquePencils = new Map(arr2.map(s => [s.value, s.price]));

Затем, когда мы отображаем массив, нам нужно присвоить имя элемента (например, Карандаш) для коллекции Map для get объекта из коллекции карт.

arr1.map(a => ({...a, price: uniquePencils.get(a.item)}));

In Кроме того, мы использовали оператор .... Это называется распространенным синтаксисом. Копирует собственные перечисляемые свойства из предоставленного объекта в новый объект.

Пример:

let arr1 = [{
  "_id": 1,
  "item": "Pencil",
  "color": "Red"
},{
  "_id":2,
  "item": "Pen",
  "color": "Yellow"
},{
  "_id": 3,
  "item": "Pencil",
  "color": "Green"
}];

let arr2 = [{
  "value":"Pencil",
  "price":1000,
},{
  "value":"Pen",
  "price":1500,
}];

const uniquePencils = new Map(arr2.map(s => [s.value, s.price]));
const result = arr1.map(a => ({...a, price: uniquePencils.get(a.item)}));
console.log(result);
...