【问题标题】:Combine two multi-dimensional arrays inner values合并两个多维数组内部值
【发布时间】:2016-05-27 12:30:08
【问题描述】:

我有以下两个对象:

var object1  = {
  "user1@yahoo.com": [
    {
      "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 = {
  "user1@yahoo.com": [
    {
      "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"
    }
  ],
  "user3@yahoo.com": [
    {
      "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 = {
  "user1@yahoo.com": [
    {
      "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"
    }
  ]
}

标识该组消息的电子邮件相同。

【问题讨论】:

  • user3@yahoo.com 不在结果列表中,因为它在 两个 array1array2 中都不存在?
  • 是的,只合并 user1@yahoo.com 节点

标签: javascript arrays multidimensional-array


【解决方案1】:

首先,从每个对象中获取键。然后,对于两个对象中存在的每封电子邮件,连接它们的列表。

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

请注意,您的 array1array2array3 变量实际上是对象而不是数组。我建议您更改他们的名字,以免他们混淆其他将阅读此代码的人(甚至是您以后)。

【讨论】:

  • 谢谢。像魔术一样工作。是的,正在将它们重命名为对象
【解决方案2】:
var map = Object.keys(array1).reduce(function( map, email ) {
    map[email] = array1[email];
    if (array2.hasOwnProperty(email)) map[email] = map[email].concat(array2[email]);
    return map;
}, {});

【讨论】:

    【解决方案3】:

    这个组合如你所愿:

    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['user1@yahoo.com'].push( obj2[key][keyB] );
            }
            sizeA++;
          }
       }
       return obj1;
    };
    var newObjects = Object.combineArrays(obj1, obj2);
    console.log(newObjects);
    

    【讨论】:

      【解决方案4】:

      使用下划线

      _.mapObject(array1,function(val,key){
          return _.union(val,array2[key]);
      })
      

      【讨论】:

      • 问题中没有下划线标签,所以我们应该给出 vanilla-js 的答案。 :)
      猜你喜欢
      • 2015-12-27
      • 1970-01-01
      • 2023-03-28
      • 2011-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-30
      相关资源
      最近更新 更多