如何按相同键将对象数组转换为指定结构的数组或对象?
按相同键合并对象数组的多种实现方式
我拥有一个对象数组,希望按相同键将这些对象合并为单个集合(数组或对象形式均可),同时保留对应datetime与键值组成的子数组。目前已通过forEach()方法实现该需求,但想了解其他可行的实现方式。
当前输入数组
[ { "datetime": "2022-01-10", "a": 0.5, "b": 80.6, "c": 1002.2 }, { "datetime": "2022-01-11", "a": 0.7, "b": 80.4, "c": 1002.4 }, { "datetime": "2022-01-12", "a": 0.4, "b": 80.2, "c": 1002.3 } ]
预期结果
数组形式结果
[ [ ["2022-01-10", 0.5], ["2022-01-11", 0.7], ["2022-01-12", 0.4] ], [ ["2022-01-10", 80.6], ["2022-01-11", 80.4], ["2022-01-12", 80.2] ], [ ["2022-01-10", 1002.2], ["2022-01-11", 1002.4], ["2022-01-12", 1002.3] ] ]
对象形式结果
{ "a": [ ["2022-01-10", 0.5], ["2022-01-11", 0.7], ["2022-01-12", 0.4] ], "b": [ ["2022-01-10", 80.6], ["2022-01-11", 80.4], ["2022-01-12", 80.2] ], "c": [ ["2022-01-10", 1002.2], ["2022-01-11", 1002.4], ["2022-01-12", 1002.3] ] }
现有forEach实现
const foo = [[], [], []]; json.forEach((item) => { const [a, b, c] = foo; a.push([item.datetime, item.a]); b.push([item.datetime, item.b]); c.push([item.datetime, item.c]); });
其他实现方式
1. 使用reduce生成对象形式结果(适配动态键)
不需要提前固定键名,自动处理所有非datetime的键:
const resultObj = json.reduce((acc, item) => { const datetime = item.datetime; Object.keys(item).forEach(key => { if (key !== 'datetime') { acc[key] = acc[key] || []; acc[key].push([datetime, item[key]]); } }); return acc; }, {});
2. 从对象结果转换为数组形式
基于上面的对象结果,直接提取值即可得到数组形式:
const resultArray = Object.values(resultObj);
3. 用reduce直接生成数组形式(固定键场景)
如果确定键为a、b、c,可以直接初始化数组结构:
const resultArray = json.reduce((acc, item) => { acc[0].push([item.datetime, item.a]); acc[1].push([item.datetime, item.b]); acc[2].push([item.datetime, item.c]); return acc; }, [[], [], []]);
4. 结合map与Object.entries实现
先提取目标键,再遍历每个键生成对应数组:
// 获取所有非datetime的键 const keys = Object.keys(json[0]).filter(key => key !== 'datetime'); // 生成对象形式结果 const resultObj = Object.fromEntries( keys.map(key => [ key, json.map(item => [item.datetime, item[key]]) ]) ); // 转数组形式:Object.values(resultObj)
内容的提问来源于stack exchange,提问作者ishikawa
相关产品推荐
相关产品推荐

