如何用前一个非空键的最后一个值填充空数组

本文介绍一种遍历对象键值对的方法,将值为空数组的字段,自动填充为前一个非空键中数组的最后一个元素,适用于数据补全、状态延续等场景。

在实际开发中,我们常遇到结构化数据中部分字段暂未赋值(如空数组 []),但业务逻辑要求其继承前一个有效状态的情形。例如,在表单步骤、时间序列状态快照或配置继承等场景下,需将空值“向前回填”为最近一次出现的有效值。

以下是一个简洁可靠的解决方案:

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),简洁高效,适合嵌入数据预处理流水线。