[英]Flatten array of objects
我有一个来自 formData serializeArray 函数的对象数组。 例如:
[
0 : {name: 'animal_monkey', value: 'banana'}
1 : {name: 'animal_horse', value: 'radishes'}
2 : {name: 'fruit_banana', value: 'yellow'}
3 : {name: 'fruit_apple', value: 'red'}
]
我正在寻找一种方法将这些不同的元素放入单个对象中,按类别划分并为其分配适当的值,如下所示:
{
animal: {
monkey : banana,
horse : radishes
},
fruit: {
banana : yellow,
apple : red
}
}
我试过用reduce和Objectassign来做这个,就像这样
obj = keys.map((k, i) => k.reduceRight((value, key) => ({[key]: value}), vals[i]) )
result = Object.assign({}, ...obj)
其中,keys 是一个 ['animal_monkey', 'animal_horse', 'fruit_banana', 'fruit_apple'] 数组,vals 是一个包含值的列表:['banana', 'radishes', 'yellow', 'red']。 然而,也许正如预期的那样,这些值被覆盖了,我最终得到:
{
animal: {
horse : radishes
},
fruit: {
apple : red
}
}
第一个值在分配中不存在。 有没有人有一个好主意如何使这项工作?
谢谢!
您可以在_
上拆分每个name
,然后使用array#reduce
创建具有类别和动物名称的对象。
const data = [ {name: 'animal_monkey', value: 'banana'}, {name: 'animal_horse', value: 'radishes'}, {name: 'fruit_banana', value: 'yellow'}, {name: 'fruit_apple', value: 'red'} ], result = data.reduce((r,o) => { const [category, name] = o.name.split('_'); r[category] ??= {}; r[category][name] = o.value; return r; }, {}); console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
您可以设置一个将保存最终组合对象的变量,然后使用array.forEach
将数组中的每个元素添加到该array.forEach
let single = {};
arr.forEach(obj => {
let [catagory, name] = obj.name.split('_'); // catagory = before the _, name = after the _
single[catagory] ??= {}; // make sure the catagory exists as an object in single
single[catagory][name] = obj.value;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.