forEach 循环无法自增变量的问题?

id = 0

test(data){
    if(data.length !=0){
        data.forEach(it=>{
            it['key'] == this.id;
            this.id++;
            it.children = it.list || it.roomList;
            this.test(it.children);
        })
    }
    return
}

循环之后,key的值都是1,为什么呢?

阅读 2.4k
5 个回答

1679466616619.png
如果你在其他地方没有进行过修改的话,应该是正常的

看样子 this 是 global 对象,非 strict 模式,浏览器下是这样的环境。测试了,没毛病,只改了两个地方:

  1. it["key"] = this.id
    如果用 == 根本就没赋值,所以可能是原来的值吧。但原来的值是啥我就不知道了。
  2. if (data.length != 0) 改为 if (data?.length > 0)
    在这里:it.children = it.list || it.roomList,如果这两个属性都不存在,那 it.children 就可能是 undefined,这种情况下下面的 this.test(it.children) 会出错,因为 data.length 会报 Cannot read properties of undefined (reading 'length')

下面是在 Node 环境下写的一个测试(改过的代码,测试数据来自「树,计算父节点的值」)

const it = {
    id: 0,
    test(data) {
        if (data?.length > 0) {
            data.forEach(it => {
                it.key = this.id;
                this.id++;
                this.test(it.children);
            });
        }
        return;
    }
};


const data = [{
    "name": "某某公司",
    "children": [
        {
            "name": "生产序列",
            "children": [
                { "name": "研发部", "children": [{ "name": "软件部" }, { "name": "测试部" }] },
                { "name": "工程部", "children": [{ "name": "预算部" }, { "name": "项目管理部" }] }
            ]
        },
        { "name": "行财序列", "children": [{ "name": "财务部" }, { "name": "办公室" }] }
    ]
}];

it.test(data);
console.dir(data, { depth: null });

我觉得是,因为你递归调用了,但是每次递归的时候id都是++的,所以肯定每次递归的时候要设置成0

你的data应该相当于二维数组,处理完外面之后,还想给里面数组 children 也增加 key

test(data){
    // 增加这里
    this.id = 0;
    if(data.length !=0){
        data.forEach(it=>{
            it['key'] = this.id;
            this.id++;
            it.children = it.list || it.roomList;
            this.test(it.children);
        })
    }
    return
}
本文参与了SegmentFault 思否面试闯关挑战赛,欢迎正在阅读的你也加入。

建议 debug 进行排查,看看每次的 id 是否是正确值,以及在递归过程中是否出现了错误等等

本文参与了SegmentFault 思否面试闯关挑战赛,欢迎正在阅读的你也加入。
推荐问题
宣传栏