JavaScript新手求助:按指定规则重组数组数据
解决方案:一次遍历实现数组重组
嘿,我完全懂你现在的需求!这种按规则重组数组的问题,其实不用先提取所有yes元素的索引那么绕,咱们用一次遍历就能轻松搞定,逻辑还特别清晰。
核心思路
咱们只需要维护两个变量:
- 一个用来存放最终结果的数组
- 一个
currentContainer变量,专门追踪当前需要添加sub子数组的isNew:"yes"元素
遍历原始数组时:
- 遇到
isNew:"yes"的元素,就把它作为新的“容器”,给它加上空的sub数组,然后放进结果数组,同时让currentContainer指向这个容器 - 遇到
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
相关产品推荐
相关产品推荐

