
本文介绍一种遍历对象键值对的方法,将值为空数组的字段,自动填充为前一个非空键中数组的最后一个元素,适用于数据补全、状态延续等场景。
在实际开发中,我们常遇到结构化数据中部分字段暂未赋值(如空数组 []),但业务逻辑要求其继承前一个有效状态的情形。例如,在表单步骤、时间序列状态快照或配置继承等场景下,需将空值“向前回填”为最近一次出现的有效值。
以下是一个简洁可靠的解决方案:
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];
}
// 忽略非数组类型值(增强鲁棒性)
}✅ 关键设计说明:
- 使用 lastValue 缓存最新有效值(即上一个非空数组的末项);
- 显式判断 Array.isArray() 避免对非数组值(如 null、undefined、对象等)误操作;
- 仅在 myitems[key] 确为非空数组时更新 lastValue,确保状态传递准确;
- 空数组填充后变为 [lastValue](单元素数组),保持结构一致性,便于后续统一处理。
⚠️ 注意事项:
- 若首项即为空数组(如 items1 为空),则 lastValue 仍为 null,该位置将保持 [] —— 符合“向前继承”语义(无前值可继承);
- 原始数据会被就地修改;如需不可变更新,建议先深拷贝对象(例如使用 structuredClone(myitems) 或第三方库);
- 若需支持嵌套结构或多级回填(如跨对象层级),应扩展为递归遍历,但本例中线性顺序遍历已满足需求。
执行后,示例数据将变为:
{
'items1': [{first:true, second:false}, {first:true, second:true}],
'items2': [{first:true, second:true}], // ← 回填自 items1 最后一项
'items3': [{first:true, second:true}], // ← 继续沿用
'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}]
}该方法时间复杂度为 O(n),空间复杂度为 O(1),简洁高效,适合嵌入数据预处理流水线。










