Объедините два внутренних значения многомерных массивов

У меня есть следующие два объекта:

var object1  = {
  "[email protected]": [
    {
      "status": "Unread",
      "message": "Some message 1",
      "senderId": "0063f297-0da6-4c23-9a53-0480c273d177",
      "id": "088b71bc-5b64-4f09-bba4-cf88b3cc598e",
      "time": "2016-05-13T10:30:11.495Z"
    },
    {
      "status": "Unread",
      "message": "Some other message 2",
      "senderId": "0063f297-0da6-4c23-9a53-0480c273d177",
      "id": "39b2850b-d8ac-4d23-9fa6-e7056fb6c030",
      "time": "2016-05-13T10:30:03.310Z"
    }
  ]
};

var object2 = {
  "[email protected]": [
    {
      "message": "Some message 1",
      "id": "088b71bc-5b64-4f09-bba4-cf88b3cc598e",
      "time": "2016-05-13T10:30:11.495Z"
    },
    {
      "message": "Some other message 2",
      "id": "39b2850b-d8ac-4d23-9fa6-e7056fb6c030",
      "time": "2016-05-13T10:30:03.310Z"
    }
  ],
  "[email protected]": [
    {
      "message": "Some message 1",
      "id": "088b71bc-5b64-4f09-bba4-cf88b3cc598e",
      "time": "2016-05-13T10:30:11.495Z"
    },
    {
      "message": "Some other message 1",
      "id": "39b2850b-d8ac-4d23-9fa6-e7056fb6c030",
      "time": "2016-05-13T10:30:03.310Z"
    }
  ]
};

Мне нужно объединить их в один объект, который выглядит примерно так:

var object3 = {
  "[email protected]": [
    {
      "status": "Unread",
      "message": "Some message 1",
      "senderId": "0063f297-0da6-4c23-9a53-0480c273d177",
      "id": "088b71bc-5b64-4f09-bba4-cf88b3cc598e",
      "time": "2016-05-13T10:30:11.495Z"
    },
    {
      "status": "Unread",
      "message": "Some other message 2",
      "senderId": "0063f297-0da6-4c23-9a53-0480c273d177",
      "id": "39b2850b-d8ac-4d23-9fa6-e7056fb6c030",
      "time": "2016-05-13T10:30:03.310Z"
    },
    {
      "message": "Some message 1",
      "id": "088b71bc-5b64-4f09-bba4-cf88b3cc598e",
      "time": "2016-05-13T10:30:11.495Z"
    },
    {
      "message": "Some other message 2",
      "id": "39b2850b-d8ac-4d23-9fa6-e7056fb6c030",
      "time": "2016-05-13T10:30:03.310Z"
    }
  ]
}

где электронная почта, которая идентифицирует группу сообщений, одинакова.


person dadidaochieng    schedule 27.05.2016    source источник
comment
[email protected] отсутствует в списке результатов, потому что его нет в оба array1 и array2?   -  person iulian    schedule 27.05.2016
comment
да, объединять только узлы [email protected]   -  person dadidaochieng    schedule 27.05.2016


Ответы (3)


Сначала получите ключи от каждого объекта. Затем для каждого электронного письма, присутствующего в обоих объектах, объедините их списки.

var keys1List = Object.getOwnPropertyNames(array1),
    keys2List = Object.getOwnPropertyNames(array2),
    result = {};

keys1List.forEach(function(email) {
    if (keys2List.indexOf(email) > -1) {
        result[email] = array1[email].concat(array2[email]);
    }
});

Обратите внимание, что ваши переменные array1, array2 и array3 на самом деле являются объектами, а не массивами. Я бы посоветовал вам изменить их имена, чтобы они не сбивали с толку других людей (или даже вас позже), которые будут читать этот код.

person iulian    schedule 27.05.2016
comment
Спасибо. работает как по волшебству. Да, я переименовываю их в объекты - person dadidaochieng; 27.05.2016

этот комбайн, как вы хотите:

Object.combineArrays = function(obj1, obj2) {
   var sizeA = 0, key, keyB;
   for (key in obj2) {
      if (obj1.hasOwnProperty(key) && obj2.hasOwnProperty(key)) {
        for (keyB in obj2[key]) {
           obj1['[email protected]'].push( obj2[key][keyB] );
        }
        sizeA++;
      }
   }
   return obj1;
};
var newObjects = Object.combineArrays(obj1, obj2);
console.log(newObjects);
person v1000    schedule 27.05.2016

использовать подчеркивание

_.mapObject(array1,function(val,key){
    return _.union(val,array2[key]);
})
person gu mingfeng    schedule 27.05.2016
comment
В вопросе нет тега подчеркивания, поэтому мы должны дать ответы vanilla-js. :) - person Shilly; 27.05.2016