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

15次阅读

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

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

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

text=ZqhQzanResources