【问题标题】:Javascript removing elements in forEach [duplicate]Javascript删除forEach中的元素[重复]
【发布时间】:2014-12-10 19:17:47
【问题描述】:

我正在尝试创建一个可以从 forEach 循环中删除元素的函数。

功能:

loopAndEdit = function(array,callback) {
    var helper = {
        data:{},
        get:function() {
            return helper.data;
        },
        remove:function() {
            index = array.indexOf(helper.data);
            array.splice(index,1);
            return true;
        }
    };

    tempArray = array;

    tempArray.forEach(function(row) {
        helper.data = row;
        callback(helper)
    });
}

为了测试它,我遍历一个数组并尝试删除所有元素:

names = ['abe','bob','chris'];

loopAndEdit(names,function(helper){
    console.log('Working on ' + helper.data);

    helper.remove();
});

console.log(names);

输出为:

Working on abe
Working on chris
[ 'bob' ]

我希望输出类似于:

Working on abe
Working on bob
Working on chris
[]

我感觉可能是 helper.remove() 造成了麻烦,但我现在不确定。

感谢您的帮助!

【问题讨论】:

    标签: javascript arrays node.js foreach


    【解决方案1】:

    这是因为您的 forEach 循环无法遍历所有 3 个元素,因为您要删除 forEach 循环中的一项。

    因此,假设您的 forEach 循环遍历索引 0 和比 1 删除索引 1 的位置。此时数组的长度更改为 n-1,但 for 循环内的索引仍然相同。

    为了制作一个数组的副本,这样它就不会对原始数组进行更改。

    这样做 -

    var tempArray = names.slice(0);
    

    而不是这个 -

    var tempArray = names;
    

    【讨论】:

    • tempArray = 数组;我制作了数组的副本,这样即使我删除了一个元素,我也可以遍历所有内容。
    • @Subie:那不是副本。这是对原作的参考。
    • 啊哈,那要怎么复印呢?编辑:看起来 array.slice(0) 可以解决问题。
    • 是的,但这不是副本。 tempArray 和 names 都指向同一个数组。因此,如果您对其中一个进行任何更改,其他人也会得到更改
    • @Subie:这些都是经常被问到的问题。要制作浅拷贝,tempArray = array.slice()
    猜你喜欢
    • 2020-06-26
    • 2012-10-21
    • 2020-06-18
    • 2015-10-04
    • 2019-03-23
    • 2019-11-13
    • 2015-03-07
    • 2017-03-21
    • 2023-01-26
    相关资源
    最近更新 更多