如何按固定顺序(High/Medium/Low)分组对象数组属性生成目标数组
解决固定顺序分组数据的问题
嘿,我清楚你的需求了——你需要不管原数据里values内部的键顺序如何,最终结果都严格按照High、Medium、Low的顺序生成数组对吧?
原代码的问题在于,你是从样本数据里动态提取键集合(keySet),这就导致结果顺序完全依赖数据里键第一次出现的顺序,没办法保证固定性。要解决这个问题,核心思路是主动定义你想要的固定顺序,而不是被动从数据里提取。
修改后的代码
let sampleData = [ { values: { High: 4, Low: 5, Medium: 7 }, time: "1571372233234", sum: 16 }, { values: { High: 5, Low: 3, Medium: 1 }, time: "1571372233234", sum: 9 }, { time: "14354545454", sum: 0 }, { time: "14354545454", sum: 0 } ]; // 第一步:定义你需要的固定顺序,这是核心! const fixedOrder = ['High', 'Medium', 'Low']; // 第二步:初始化结果数组,按照固定顺序创建结构 const result = fixedOrder.map(name => ({ name, data: [] })); // 第三步:遍历每个样本数据,填充对应的数据 sampleData.forEach(item => { const values = item.values || {}; // 按照固定顺序给每个分组的data数组push值(没有就填0) result.forEach(group => { group.data.push(values[group.name] || 0); }); }); console.log(result);
代码解释
- 固定顺序定义:
fixedOrder数组直接明确了你要的顺序,后续所有操作都基于这个数组,从根源上保证了结果顺序的稳定性。 - 初始化结果结构:用
map直接生成符合要求的初始数组结构,每个元素都对应固定顺序里的键,且data数组为空。 - 填充数据:遍历每个样本对象,对每个固定分组,提取对应的值(如果
values不存在或者没有该键,就填0),push到对应分组的data数组里。
输出结果
运行这段代码后,你会得到完全符合预期的结果:
[ { name: 'High', data: [4, 5, 0, 0] }, { name: 'Medium', data: [7, 1, 0, 0] }, { name: 'Low', data: [5, 3, 0, 0] } ]
对比原代码,这种方式不仅保证了顺序固定,逻辑也更清晰——因为你的需求是明确的固定顺序,不需要动态推断键的集合,直接硬编码目标顺序是最可靠的方案。
内容的提问来源于stack exchange,提问作者joy08
相关产品推荐
相关产品推荐

