Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/425.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从传递给forEach的回调中拼接Javascript数组_Javascript_Arrays_Foreach - Fatal编程技术网

从传递给forEach的回调中拼接Javascript数组

从传递给forEach的回调中拼接Javascript数组,javascript,arrays,foreach,Javascript,Arrays,Foreach,我有一段代码,它应该迭代数组中的每个项,根据某些条件删除项: //iterate over all items in an array //if the item is "b", remove it. var array = ["a", "b", "c"]; array.forEach(function(item) { if(item === "b") { array.splice(array.indexOf(item), 1); } console

我有一段代码,它应该迭代数组中的每个项,根据某些条件删除项:

//iterate over all items in an array
//if the item is "b", remove it.

var array = ["a", "b", "c"];

array.forEach(function(item) {
    if(item === "b") {
        array.splice(array.indexOf(item), 1);
    }

    console.log(item);
});
期望输出:

a
b
c
实际产量:

a
b
显然,本地forEach方法不会在每次迭代后检查该项是否已被删除,因此如果已被删除,则跳过下一项。除了重写forEach方法或实现我自己的类来代替数组之外,还有更好的方法吗


编辑-进一步我的评论,我想解决方案是只使用一个标准for循环。如果您有更好的方法,请随意回答。

让我们看看为什么JavaScript会这样。据报道,

删除索引1处的元素时,索引2处的元素将成为索引1处的元素,而该对象的索引2不存在

现在,JavaScript在对象中查找未找到的元素2,因此它跳过函数调用

这就是为什么您只看到
a
b


实际的方法是使用


一种可能是使用
array.slice(0)
函数,该函数创建数组的副本(),从而将迭代与删除分离

然后,对使用
array.forEach
的原始方法的唯一更改是将其更改为
array.slice(0)。forEach
将起作用:

array.slice(0).forEach(function(item) {
    if(item === "b") {
        array.splice(array.indexOf(item), 1);
    }
    alert(item)
});
在forEach之后,数组将只包含
a
c


A.

另一种可能是使用
array.reduceRight
函数来避免跳过:

//iterate over all items in an array from right to left
//if the item is "b", remove it.

const array = ["a", "b", "c"];

array.reduceRight((_, item, i) => {
    if(item === "b") {
        array.splice(i, 1);
    }

});

console.log(array);

在使用
array.prototype.filter
时,数组将只包含
a
c

,如图所示。叶的答案是一个很好的方法,但这也可以通过
while
循环来实现。例如:

常量数组=[“a”、“b”、“c”]; 设i=0; while(i
事实上,我可以理解他们为什么不尝试支持此功能-您需要检查删除的项目是否为当前项目,否则您可能会不必要地向后跳过(例如,如果检查只是基于长度是否减少了一个或多个)。似乎太复杂,无法实现。+1但是,如果您需要对数组项进行任何更改(就像我在我的环境中所做的那样-对象数组),以及过滤掉项目,最好使用
reduce
。?在
返回后,您无法将任何内容记录到控制台statement@Blauhirn不,你不能。@JuanBiscaia这是我的观点。在上面的例子中,返回后有一个日志语句。@Blauhirn哦,好的,对不起,我很忙,没有注意到你没有问问题,我的错。另外,如果你使用lodash/下划线,你可以执行
。.clone(array).forEach(function(item){…})
这很有趣,但它涉及到每次迭代的查找,虽然搜索的数组的大小减小了。编写for循环并注意索引会更快。
//iterate over all items in an array from right to left
//if the item is "b", remove it.

const array = ["a", "b", "c"];

array.reduceRight((_, item, i) => {
    if(item === "b") {
        array.splice(i, 1);
    }

});

console.log(array);