
本文介绍一种遍历对象属性并动态填充空数组的方法:当某个键对应的值为空数组时,将其替换为前一个非空数组的最后一个元素,确保数据连续性。
在实际开发中,我们常遇到结构化数据中存在“占位空数组”的场景(如分页列表、配置项序列等),而业务逻辑要求这些空位置继承前一个有效条目的状态。上述需求正是典型示例:需遍历 myitems 对象的每个键值对,识别空数组([]),并用最近一次出现的非空数组的末尾元素进行填充。
实现思路清晰且高效:
- 声明一个变量 lastValue 缓存上一个有效末尾元素;
- 按对象属性的自然遍历顺序(即 items1 → items2 → …)逐个检查;
- 若当前值为非空数组,则更新 lastValue 为该数组最后一项(arr[arr.Length – 1]);
- 若当前值为空数组,且 lastValue 已存在,则将其包装为单元素数组 [lastValue] 赋值给当前键。
以下是完整可运行代码:
let lastValue = null; for (const key in myitems) { if (Array.isArray(myitems[key]) && myitems[key].length === 0) { // 当前值为空数组,且已有有效 lastValue,则填充 if (lastValue !== null) { myitems[key] = [lastValue]; } } else if (Array.isArray(myitems[key]) && myitems[key].length > 0) { // 更新 lastValue 为当前数组最后一个元素 lastValue = myitems[key][myitems[key].length - 1]; } // 非数组值(如 undefined、NULL、对象等)将被忽略,保持原样 }
✅ 注意事项:
- 此算法依赖属性遍历顺序。ES2015+ 中,for…in 对象属性的遍历顺序遵循插入顺序(若键为字符串且可枚举),因此 items1 到 items7 的处理顺序是可靠的;
- 添加了 Array.isArray() 类型校验,避免因意外非数组值(如 null 或 {})导致 length 访问错误;
- 若首个键对应空数组(即无前置有效值),则保持为空——符合“用前一个值填充”的语义逻辑;
- 填充后所有空数组均变为长度为 1 的数组,结构统一,便于后续消费。
执行后,原始 myitems 将被就地修改为:
{ 'items1': [{first:true, second:false}, {first:true, second:true}], 'items2': [{first:true, second:true}], // ← 填充自 items1 末尾 'items3': [{first:true, second:true}], // ← 填充自 items2(已更新) 'items4': [{first:true, second:false}, {first:true, second:true}], 'items5': [{first:false, second:true}], 'items6': [{first:false, second:true}], // ← 填充自 items5 末尾 'items7': [{first:true, second:true}] }
该方案简洁、低侵入、无需额外依赖,适用于前端数据预处理或 node.js 后端响应组装等场景。