Gabungkan dua nilai dalam array multidimensi

Saya memiliki dua objek berikut:

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"
    }
  ]
};

Saya perlu menggabungkannya menjadi satu objek yang terlihat seperti ini:

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"
    }
  ]
}

dimana email yang mengidentifikasi grup pesannya sama.


person dadidaochieng    schedule 27.05.2016    source sumber
comment
apakah [email protected] tidak ada dalam daftar hasil karena tidak ada di keduanya array1 dan array2?   -  person iulian    schedule 27.05.2016
comment
ya, gabungkan hanya node [email protected]   -  person dadidaochieng    schedule 27.05.2016


Jawaban (3)


Pertama, dapatkan kunci dari setiap objek. Kemudian, untuk setiap email yang ada di kedua objek, gabungkan daftarnya.

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]);
    }
});

Perhatikan bahwa variabel array1, array2 dan array3 Anda sebenarnya adalah objek dan bukan array. Saya menyarankan Anda mengubah nama mereka sehingga mereka tidak membingungkan orang lain (atau bahkan Anda nanti) yang akan membaca kode ini.

person iulian    schedule 27.05.2016
comment
Terima kasih. bekerja seperti sihir. Ya, saya mengganti namanya menjadi objek - person dadidaochieng; 27.05.2016

gabungan ini seperti yang Anda inginkan:

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

gunakan garis bawah

_.mapObject(array1,function(val,key){
    return _.union(val,array2[key]);
})
person gu mingfeng    schedule 27.05.2016
comment
Tidak ada tag garis bawah dalam pertanyaan, jadi kita harus memberikan jawaban vanilla-js. :) - person Shilly; 27.05.2016