问题描述
我想将对象数组聚合为单个对象,每个对象都具有不同的值。但是我的代码没有给我想要的输出。有人可以帮我吗?
My Input :
[{
"obj1" : "value1","obj2" : ["abc","def"],"obj3" : ["ghi"],"obj4" : "value4",},{
"obj1" : "value2","mno"],"obj3" : ["klm"],}]
Output I want:
{
"obj1" : ["value1","value2"]
"obj2" : ["abc","def","obj3" : ["ghi","klm"],"obj4" : ["value4"]
}
My Code:
const result = filterData.reduce((a,c) =>
(Object.keys(c).map(k => a[k] = [...a[k] || [],c[k]]),a),{})
解决方法
您可以使用 array#reduce
从对象数组创建单个对象。您可以使用 Set
获得不同的值。
const data = [{ "obj1" : "value1","obj2" : ["abc","def"],"obj3" : ["ghi"],"obj4" : "value4",},{ "obj1" : "value2","mno"],"obj3" : ["klm"],}],result = data.reduce((r,o) => {
Object.keys(o).forEach(k => {
r[k] = [...new Set((r[k] || []).concat(o[k]))];
});
return r;
},{});
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
这里我使用了 lodash 的一些帮助程序来解决您的问题。
const input = [{
"obj1" : "value1",{
"obj1" : "value2",}]
function customizer(objValue,srcValue) {
if (_.isArray(objValue)) {
return _.union(objValue,srcValue);
}
}
const output = input.reduce((acc,cur) => {
const modifiedCur = _.mapValues(cur,function(o) { return typeof o === 'string' ? [o]: o; });
acc = _.mergeWith(acc,modifiedCur,customizer);
return acc
},{})
console.log(output)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js"></script>