如何为已有键值对添加键值对?分组对象时遇数据丢失问题
问题根源与修正方案
你的代码核心问题是误用数组存储键值对:你把result[phase]初始化为数组[],但数组的length只统计数字索引的元素数量,当你给数组添加block这类非数字索引的属性时,这些属性不会被计入length,而且数组的遍历方法(比如forEach)也不会处理这些额外属性,导致看起来像block数据丢失。
正确的做法是把phase对应的容器改成对象,因为对象才是用来存储键值对结构的。
修正后的代码
var result = {}; Items.forEach(item => { // 处理Phase,用对象存储block分组 var phase = item.Phase ?? 'None'; if (!result[phase]) { result[phase] = {}; // 这里从数组改成对象 } // 处理Block,用数组存储对应Item var block = item.Block ?? 'None'; if (!result[phase][block]) { result[phase][block] = []; } result[phase][block].push(item); });
修正后的数据结构
最终你会得到一个层级清晰的键值对结构,示例如下:
{ "Phase 1": { "1": [ { Description: "xxx", Value: 199.99, ... }, // 同Phase1、Block1的其他Item ], "None": [/* Phase1但无Block的Item */] }, "None": { "2": [/* 无Phase但Block2的Item */] } }
此时每个phase对应的都是对象,block作为对象的键,对应的值是Item数组,既不会丢失数据,后续遍历和使用也更符合逻辑。
内容的提问来源于stack exchange,提问作者dewit777
相关产品推荐
相关产品推荐

