Как объединить два массива объекта с помощью lodash? [Дубликат]

На этот вопрос уже есть ответ здесь:

Как объединить несколько массивов объектов по идентификатору в JavaScript? 4 ответа

У меня два массива с одним общим полемчлен, как я могу объединить тему легко?

Например:

var arr1 = [{
  "member" : ObjectId("57989cbe54cf5d2ce83ff9d6"),
  "bank" : ObjectId("575b052ca6f66a5732749ecc"),
  "country" : ObjectId("575b0523a6f66a5732749ecb")
},
{
  "member" : ObjectId("57989cbe54cf5d2ce83ff9d8"),
  "bank" : ObjectId("575b052ca6f66a5732749ecc"),
  "country" : ObjectId("575b0523a6f66a5732749ecb")
}];

var arr2 = [{
    "member" : ObjectId("57989cbe54cf5d2ce83ff9d6"),
    "name" : 'xxxxxx',
    "age" : 25
},
{
    "member" : ObjectId("57989cbe54cf5d2ce83ff9d8"),
    "name" : 'yyyyyyyyyy',
    "age" : 26
}];

Ожидаемое:

var merge = [{
  "member" : ObjectId("57989cbe54cf5d2ce83ff9d6"),
  "bank" : ObjectId("575b052ca6f66a5732749ecc"),
  "country" : ObjectId("575b0523a6f66a5732749ecb"),
  "name" : 'xxxxxx',
  "age" : 25
},
{
  "member" : ObjectId("57989cbe54cf5d2ce83ff9d8"),
  "bank" : ObjectId("575b052ca6f66a5732749ecc"),
  "country" : ObjectId("575b0523a6f66a5732749ecb"),
  "name" : 'yyyyyyyyyy',
  "age" : 26
}];

Я старался

var merge = _.unionBy(arr1, arr2, 'member');

но не объединены, как ожидалось. показанныйarray1 значение. Может кто-нибудь мне помочь?

 Simon Hänisch27 июл. 2016 г., 14:40
 4castle29 июл. 2016 г., 16:13
Ответ, который вы получили ранее, был скорее жемчужиной, чем вы думаете. Не просите нас публиковать его дважды, просто закройте как дубликат.
 ryeballar27 июл. 2016 г., 16:18
Я помню, что вы спросили этовопрос ранее и я думаю, что наиболее одобренный ответ должен был быть достаточным в качестве ответа. Просто поменяйmemberID сmember и удалитьarr3 а такжеarr4 в конкатенации.

Ответы на вопрос(2)

Создать словари для обоих массивов, используя_.keyBy(), сливаться словари, и преобразовать результат в массив с_.values(), Таким образом, порядок массивов не имеет значения. Кроме того, он также может обрабатывать массивы различной длины.

const ObjectId = (id) => id; // mock of ObjectId
const arr1 = [{"member" : ObjectId("57989cbe54cf5d2ce83ff9d8"),"bank" : ObjectId("575b052ca6f66a5732749ecc"),"country" : ObjectId("575b0523a6f66a5732749ecb")},{"member" : ObjectId("57989cbe54cf5d2ce83ff9d6"),"bank" : ObjectId("575b052ca6f66a5732749ecc"),"country" : ObjectId("575b0523a6f66a5732749ecb")}];
const arr2 = [{"member" : ObjectId("57989cbe54cf5d2ce83ff9d6"),"name" : 'xxxxxx',"age" : 25},{"member" : ObjectId("57989cbe54cf5d2ce83ff9d8"),"name" : 'yyyyyyyyyy',"age" : 26}];

const merged = _(arr1) // start sequence
  .keyBy('member') // create a dictionary of the 1st array
  .merge(_.keyBy(arr2, 'member')) // create a dictionary of the 2nd array, and merge it to the 1st
  .values() // turn the combined dictionary to array
  .value(); // get the value (array) out of the sequence

console.log(merged);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.14.0/lodash.min.js"></script>

Использование ES6карта

Concat массивы иуменьшить объединенный массив на карту. использованиеОбъект # правопреемник комбинировать объекты с одним и тем жеmember на новый объект, и сохранить в карте. Преобразовать карту в массив сКарта # значения а такжераспространение:

const ObjectId = (id) => id; // mock of ObjectId
const arr1 = [{"member" : ObjectId("57989cbe54cf5d2ce83ff9d8"),"bank" : ObjectId("575b052ca6f66a5732749ecc"),"country" : ObjectId("575b0523a6f66a5732749ecb")},{"member" : ObjectId("57989cbe54cf5d2ce83ff9d6"),"bank" : ObjectId("575b052ca6f66a5732749ecc"),"country" : ObjectId("575b0523a6f66a5732749ecb")}];
const arr2 = [{"member" : ObjectId("57989cbe54cf5d2ce83ff9d6"),"name" : 'xxxxxx',"age" : 25},{"member" : ObjectId("57989cbe54cf5d2ce83ff9d8"),"name" : 'yyyyyyyyyy',"age" : 26}];

const merged = [...arr1.concat(arr2).reduce((m, o) => 
  m.set(o.member, Object.assign(m.get(o.member) || {}, o))
, new Map()).values()];

console.log(merged);

 magom00126 дек. 2018 г., 13:54
Я думаю, что это может нарушить порядок, поскольку объект JS Object / Map не гарантирует какой-либо.
 Seeker09 мар. 2017 г., 16:47
Я бы предпочел этот
 repo31 июл. 2018 г., 12:10
если массивы всегда имеют одинаковый размер, вы можете отсортировать по id, zip, map
 fdsfdsfdsfds05 февр. 2018 г., 11:52
да, это работает, пока lodash терпит неудачу и возвращает только содержимое последнего массива
 Ori Drori26 дек. 2018 г., 13:58
Заказ карты гарантирован, ипорядок итераций объекта гарантировано в ES6.

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

var merge = _.merge(arr1, arr2);

Который является короткой версией:

var merge = _.chain(arr1).zip(arr2).map(function(item) {
    return _.merge.apply(null, item);
}).value();

Или, если данные в массивах расположены не в определенном порядке, вы можете искать связанный элемент по значению члена.

var merge = _.map(arr1, function(item) {
    return _.merge(item, _.find(arr2, { 'member' : item.member }));
});

Вы можете легко преобразовать это в миксин. Смотрите пример ниже:

_.mixin({
  'mergeByKey' : function(arr1, arr2, key) {
    var criteria = {};
    criteria[key] = null;
    return _.map(arr1, function(item) {
      criteria[key] = item[key];
      return _.merge(item, _.find(arr2, criteria));
    });
  }
});

var arr1 = [{
  "member": 'ObjectId("57989cbe54cf5d2ce83ff9d6")',
  "bank": 'ObjectId("575b052ca6f66a5732749ecc")',
  "country": 'ObjectId("575b0523a6f66a5732749ecb")'
}, {
  "member": 'ObjectId("57989cbe54cf5d2ce83ff9d8")',
  "bank": 'ObjectId("575b052ca6f66a5732749ecc")',
  "country": 'ObjectId("575b0523a6f66a5732749ecb")'
}];

var arr2 = [{
  "member": 'ObjectId("57989cbe54cf5d2ce83ff9d8")',
  "name": 'yyyyyyyyyy',
  "age": 26
}, {
  "member": 'ObjectId("57989cbe54cf5d2ce83ff9d6")',
  "name": 'xxxxxx',
  "age": 25
}];

var arr3 = _.mergeByKey(arr1, arr2, 'member');

document.body.innerHTML = JSON.stringify(arr3, null, 4);
body { font-family: monospace; white-space: pre; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.14.0/lodash.min.js"></script>

 fdsfdsfdsfds05 февр. 2018 г., 11:49
не работает вообще, я получаю значение последнего массива вместо обоих объединенных массивов
 4castle29 июл. 2016 г., 16:19
С помощью_.find внутри_.map создает решение O (n ^ 2).
 joniba23 мар. 2017 г., 18:55
Также обратите внимание, что в этом ответе будут отсутствовать элементы в arr2, которых нет в arr1. Предпочитаю ответ Ори Дрори.

Ваш ответ на вопрос