【发布时间】:2018-12-26 06:53:53
【问题描述】:
根据我的问题:https://stackoverflow.com/a/40661953/2392461,我用示例数据打开一个新问题。
我想合并/减少这个:
var array = [{
'key1': {
'key11': 0,
'key12': 1
},
'key2': 0,
'key3': {
'key31': [1, 2],
'key32': {
'key321': 3,
'key322': [1, 2]
}
},
'key4': 'test'
}, {
'key1': {
'key11': 1,
'key12': 9
},
'key2': 2,
'key3': {
'key31': [4, 3],
'key32': {
'key321': 6,
'key322': [8, 9]
}
},
'key4': 'test'
}, {
'key1': {
'key11': 3,
'key12': 4
},
'key2': 7,
'key3': {
'key31': [3, 2],
'key32': {
'key321': 6,
'key322': [7, 8]
}
},
'key4': 'test'
}];
到这里:
{
'key1': {
'key11': [0, 1, 3],
'key12': [1, 9, 4]
},
'key2': [0, 2, 7],
'key3': {
'key31': [[1, 2], [4, 3], [3, 2]],
'key32': {
'key321': [3, 6, 6],
'key322': [[1, 2], [8, 9], [7, 8]]
}
},
'key4': 'test'
}
@stasovlas 中带有 lodash 的 reduce 函数 (https://stackoverflow.com/a/40668315/2392461) 看起来不错,但我需要深入研究对象。
_.reduce(data, function(result, item) {
var added = _.find(result, {
key4: item.key4
});
if (_.isObject(added)) {
//!! better to merge with new object and add result to array again to avoid mutable
added = _.mergeWith(added, item, function(addedVal, itemVal, key) {
if (key === 'key4') {
return addedVal;
}
return _.concat(addedVal, itemVal);
});
return result;
}
return _.concat(result, item);
}, []);
这里的结果是一个合并的对象,只在对象的第 1 层。
[ { key1: [ [Object], [Object], [Object] ],
key2: [ 0, 2, 7 ],
key3: [ [Object], [Object], [Object] ],
key4: 1 } ]
我不知道如何得到我的结果。我想我必须迭代每个对象 n 次。 n 是物体的深度。
这是正确的方法还是比我想象的更容易?
莫克你好
【问题讨论】:
-
key4有什么特别之处?为什么它不是一个包含三个'test'的数组? -
抱歉,我从另一个数组复制了一个结果。但我需要一个像“key4”这样的 ID 密钥
标签: javascript merge lodash javascript-objects reduce