繁体   English   中英

展平对象数组

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM