如何转换对象数组,使其stats子数组统一顺序、缺失项补0
实现思路
- 第一步:遍历所有stats项,提取所有不重复的
name值,作为统一的字段顺序基准 - 第二步:遍历原数组每个元素,按基准
name列表生成新的stats数组,存在对应name则取原有value,不存在则设置value为0
完整实现代码
// 初始数据(补全了第一个对象type后缺失的逗号) const data = [ { type: 'first', stats: [ {name: 'yes', value: 11}, {name: 'no', value: 33}, ] }, { type: 'second', stats: [ {name: 'call back', value: 32}, {name: 'no', value: 77}, ] }, { type: 'third', stats: [ {name: 'yes', value: 14}, ] } ] // 1. 提取所有不重复的name,默认按出现先后排序,可按需调整顺序 const allNames = [...new Set(data.flatMap(item => item.stats.map(s => s.name)))] // 2. 转换数据 const dataTransformed = data.map(item => { // 把当前项的stats转成键值对映射,提升查找效率 const statMap = Object.fromEntries(item.stats.map(s => [s.name, s.value])) // 按统一name列表生成新的stats const newStats = allNames.map(name => ({ name, value: statMap[name] ?? 0 })) return { ...item, stats: newStats } }) console.log(dataTransformed)
输出说明
生成的dataTransformed完全符合要求:
- 所有项的stats长度、字段顺序完全一致
- 缺失的字段自动补value为0
- 原有存在的字段值保留不变
注:你给出的预期结果里第二个stats项的
namename: 'no'属于笔误,上述代码会自动修正为正确的name字段。
内容的提问来源于stack exchange,提问作者DevOverflow
相关产品推荐
相关产品推荐

