在JavaScript中加入数组的字典

时间:2014-08-18 22:53:25

标签: javascript arrays dictionary

首先,我来自Obj-C和Python,所以我可以随意编辑JavaScript teminology中的任何错误。

我正在寻找一种在JavaScript中加入多个词典的有效方法,其中每个键可以存在于多个词典中,其值是数组。

例如,我有:

{foo: [1,2], bar: [3,4]}
{foo: [5,6], baz: [7,8]}

我想加入同一个键的所有值,这意味着我应该返回:

{foo: [1,2,5,6], bar: [3,4], baz: [7,8]}

我开始做类似下面的伪代码,但我觉得应该有一种更有效的方法。

// Pseudo code
return_value = {}
for (subset in full_array)
    for (kv in subset)
        data = return_value[kv] || []
        data.push(subset[kv])
        return_value[kv] = data

2 个答案:

答案 0 :(得分:1)

使用Lo-Dash

var data = [
    {foo: [1,2], bar: [3,4]},
    {foo: [5,6]},
];

_.reduce(data, function (result, obj) {
    _.each(obj, function (array, key) {
        result[key] = (result[key] || []).concat(array)
    })
    return result
}, {})

请参阅此fiddle

答案 1 :(得分:0)

此代码有效:

var joinManyObjects = function joinManyObjects (arrayA, arrayB) 
{
  var i, j;
  for(i = 0; i < arrayB.length; i++)
  {
    for(j = 0; j < arrayA.length; j++)
    {
      var k = Object.keys(arrayB[i]);
      console.log("Common keys: "+k);
      if(k in arrayA[j])
      {
        arrayA[j][k] = arrayA[j][k].concat(arrayB[i][k]);
      }
    }
  }
}

var a = [{foo: [1,2], bar: [3,4]}];
var b = [{foo: [5,6]}];

joinManyObjects(a,b) -> a = [{"foo":[1,2,5,6],"bar":[3,4]}]

您可以添加remove duplicates或输入检测(typeof或Array.isArray)。