如何用前一个非空数组的末尾元素填充空数组

本文介绍一种遍历对象属性并动态填充空数组的方法:当某个键对应的值为空数组时,将其替换为前一个非空数组的最后一个元素,确保数据连续性。

在实际开发中,我们常遇到结构化数据中存在“占位空数组”的场景(如分页列表、配置项序列等),而业务逻辑要求这些空位置继承前一个有效条目的状态。上述需求正是典型示例:需遍历 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 后端响应组装等场景。