首先,我来自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
答案 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)。