
本文介绍一种遍历对象属性并动态填充空数组的方法:当某个键对应的值为空数组时,将其替换为前一个非空数组的最后一个元素,确保数据连续性。
在实际开发中,我们常遇到结构化数据中存在“占位空数组”的场景(如分页列表、配置项序列等),而业务逻辑要求这些空位置继承前一个有效条目的状态。上述需求正是典型示例:需遍历 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}]
}










