如何将对象数组转换为按属性类别聚合的新对象数组
解决数组对象的同类型属性聚合问题
我来帮你搞定这个数组转换的需求!先看看你原来的代码问题:你当前的写法是把每个data里的键值对都单独生成了一个带index键的对象,完全没有做同类型属性的聚合,所以才得到了一堆零散的小对象。
下面是能得到你预期结果的解决方案,我会一步步解释:
思路
核心是先把所有同前缀(比如center、storage、system)的键值对归类到同一个对象里,最后再把这些分类好的对象转换成数组。
实现代码
let array = [{ data: { center1: "1", storage1: "1", system1: "1", } }, { data: { center2: "2", storage2: "2", system2: "2", } } ]; // 用一个对象来临时存储同类型的属性分组 const groupedData = {}; // 遍历原数组中的每一项 array.forEach(item => { // 取出当前项的data对象,遍历它的所有键值对 Object.entries(item.data).forEach(([key, value]) => { // 提取键的前缀(比如从center1中拿到center) const type = key.replace(/\d+$/, ''); // 如果该类型还没有对应的分组对象,就创建一个 if (!groupedData[type]) { groupedData[type] = {}; } // 将当前键值对添加到对应类型的分组对象中 groupedData[type][key] = value; }); }); // 把分组对象的所有值提取出来,组成最终的数组 const result = Object.values(groupedData); console.log(result);
代码解释
groupedData对象:用来临时存放不同类型的属性组,比如groupedData.center会收集所有center1、center2这类键值对。- 提取前缀:用
key.replace(/\d+$/, '')去掉键末尾的数字,得到属性的类型前缀(比如center1变成center)。 - 填充分组对象:每遍历到一个键值对,就把它放到对应的分组对象里。
- 转换为数组:最后用
Object.values(groupedData)把分组对象里的所有值(也就是我们需要的每个聚合对象)提取成数组,就得到了你想要的结果。
运行这段代码后,输出的结果就是:
[ { center1: "1", center2: "2"}, { storage1: "1", storage2: "2"}, { system1: "1", system2: "2"} ]
内容的提问来源于stack exchange,提问作者yaws76
相关产品推荐
相关产品推荐

