You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript新手求助:按指定规则重组数组数据

解决方案:一次遍历实现数组重组

嘿,我完全懂你现在的需求!这种按规则重组数组的问题,其实不用先提取所有yes元素的索引那么绕,咱们用一次遍历就能轻松搞定,逻辑还特别清晰。

核心思路

咱们只需要维护两个变量:

  • 一个用来存放最终结果的数组
  • 一个currentContainer变量,专门追踪当前需要添加sub子数组的isNew:"yes"元素

遍历原始数组时:

  1. 遇到isNew:"yes"的元素,就把它作为新的“容器”,给它加上空的sub数组,然后放进结果数组,同时让currentContainer指向这个容器
  2. 遇到isNew:"no"的元素时:
    • 如果已经有活跃的currentContainer(也就是之前遇到过yes元素),就把这个no元素塞进容器的sub数组里
    • 如果还没遇到过yes元素,就直接把这个no元素加到结果数组里

完整代码示例

const originalData = [
  {id:1,isNew:"no"}, 
  {id:2,isNew:"no"}, 
  {id:3,isNew:"yes"}, 
  {id:4,isNew:"no"}, 
  {id:5,isNew:"no"}, 
  {id:6,isNew:"no"}, 
  {id:7,isNew:"yes"}, 
  {id:8,isNew:"no"}, 
  {id:9,isNew:"no"}, 
  {id:10,isNew:"yes"}
];

const transformedData = [];
let currentContainer = null;

for (const item of originalData) {
  if (item.isNew === "yes") {
    // 复制原元素并添加sub数组,避免修改原始数据
    currentContainer = {...item, sub: []};
    transformedData.push(currentContainer);
  } else {
    if (currentContainer) {
      // 已有活跃容器,将no元素放入sub
      currentContainer.sub.push(item);
    } else {
      // 第一个yes之前的no元素,直接加入结果
      transformedData.push(item);
    }
  }
}

console.log(transformedData);

代码说明

  • 用{...item, sub: []}复制原元素而不是直接修改,是为了避免污染原始数据,这是个很好的编程习惯哦
  • 整个过程只遍历一次数组,时间复杂度是O(n),效率拉满
  • 逻辑直观,每一步都对应你的需求规则,调试起来也很方便

运行这段代码后,输出的结果就是你期望的格式啦~

内容的提问来源于stack exchange,提问作者Anamika

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 18:12:30