У меня есть 2 разных объектных массива, которые я хотел бы объединить в соответствии со значением «id».

Так что, если мой первый массив выглядит так:

[
  {
   "id": "75318408571184",
   "component": "textInput",
   "index": 0,
   "label": "Text",
   "description": "description",
   "placeholder": "placeholder",
   },
  {
  "id": "9463537670672",
  "component": "textArea",
  "index": 1,
  "label": "Paragraph",
  "description": "description",
  "placeholder": "placeholder"
  }

]

И мой второй выглядит примерно так:

[
  {
   "id": "75318408571184",
   "value": "value1"
   },
  {
  "id": "9463537670672",
  "value": "value2"
  }

]

Я хотел бы получить этот массив объектов:

 [
  {
   "id": "75318408571184",
   "component": "textInput",
   "index": 0,
   "label": "Text",
   "description": "description",
   "placeholder": "placeholder",
   "value": "value1"
   },
  {
  "id": "9463537670672",
  "component": "textArea",
  "index": 1,
  "label": "Paragraph",
  "description": "description",
  "placeholder": "placeholder",
   "value": "value2"
  }

]

Есть ли аккуратный способ сделать это в угловых или javascript без зацикливания массива?

1
Chelli Kapiloff 16 Дек 2015 в 16:45

3 ответа

Лучший ответ

Попробуй это:

var result = firstArray.map(function(item) {
    var second = secondArray.find(function(i) {
        return item.id === i.id;
    });
    return second ? Object.assign(item, second) : item;
});
console.log(result);

Array.prototype.map () применяет функцию в аргументе для каждого элемента firstArray и возвращает новый массив с измененными значениями.

Object.assign () - это функция, которая копирует свойства объекта second к объекту item в приведенном выше коде.

2
madox2 16 Дек 2015 в 14:00

В простом Javascript вы можете использовать {{X0} } и Array.prototype.some()

var obj1 = [{ "id": "75318408571184", "component": "textInput", "index": 0, "label": "Text", "description": "description", "placeholder": "placeholder", }, { "id": "9463537670672", "component": "textArea", "index": 1, "label": "Paragraph", "description": "description", "placeholder": "placeholder" }],
    obj2 = [{ "id": "75318408571184", "value": "value1" }, { "id": "9463537670672", "value": "value2" }];

obj2.forEach(function (a) {
    obj1.some(function (b) {
        if (a.id === b.id) {
            b.value = a.value;
            return true;
        }
    });
});
document.write('<pre>' + JSON.stringify(obj1, 0, 4) + '</pre>');

Другая возможность - сначала создать хеш-таблицу temp, а затем напрямую манипулировать элементом.

var obj1 = [{ "id": "75318408571184", "component": "textInput", "index": 0, "label": "Text", "description": "description", "placeholder": "placeholder", }, { "id": "9463537670672", "component": "textArea", "index": 1, "label": "Paragraph", "description": "description", "placeholder": "placeholder" }],
    obj2 = [{ "id": "75318408571184", "value": "value1" }, { "id": "9463537670672", "value": "value2" }],
    temp = {};

obj1.forEach(function (a, i) {
    temp[a.id] = i;
});
obj2.forEach(function (a) {
    obj1[temp[a.id]].value = a.value;
});
document.write('<pre>' + JSON.stringify(obj1, 0, 4) + '</pre>');
2
Nina Scholz 16 Дек 2015 в 15:29

Приведенные выше ответы уже хороши. Но если вы хотите взглянуть на некоторые другие библиотеки, вы можете взглянуть на это. объединение загрузок

var object = {
  'fruits': ['apple'],
  'vegetables': ['beet']
};

var other = {
 'fruits': ['banana'],
 'vegetables': ['carrot']
};

_.merge(object, other, function(a, b) {
  if (_.isArray(a)) {
    return a.concat(b);
 }
});

// → { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot'] }
2
Pritam Banerjee 16 Дек 2015 в 14:05