当前位置: 首页 > 面试题库 >

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

董飞
2023-03-14
问题内容

我有这段代码,它应该遍历数组中的每个项目,并根据某些条件删除项目:

//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会这样表现。根据ECMAScript标准规范Array.prototype.forEach

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

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

这就是为什么您只看到a和的原因b

实际的方法是使用 Array.prototype.filter

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

array = array.filter(function(currentChar) {
    console.log(currentChar);   // a, b, c on separate lines
    return currentChar !== "b";
});
console.log(array);             // [ 'a', 'c' ]


 类似资料:
  • 问题内容: 我有一个用Java实现的javascript接口,该接口由Web视图中加载的javascript代码调用。 JS Inside webview: Java: 通过webview加载的字符串最终是: 我有一些想法: 一个。在JS中以字符串形式构建回调。 b。在将回调传递给Android.myFunction()之前,先调用回调的toString(); 我的问题是,最好的方法是什么?我希望

  • 问题内容: 我正在尝试将一些参数传递给用作回调的函数,该怎么做? 问题答案: 如果您想要更一般的东西,可以使用arguments变量,如下所示: 但是否则,您的示例可以正常工作(可以在测试器中使用arguments [0]代替回调)

  • 问题内容: 我有一个函数,将回调函数作为参数,并用一个参数调用它。 我还有一个带有两个参数的函数:和。 我想将函数作为参数传递给,但我也想作为第二个参数()传递给。我怎样才能做到这一点? 问题答案: 只需创建一个包装回调: 或使用ECMAScript 6箭头功能:

  • 问题内容: 我需要在Node.JS应用程序中观察少量目录: 问题在于fs.watch仅将文件名传递给回调函数,而没有包括它所在的目录。我是否可以通过某种方式将额外的参数传递给updated()函数,以便它知道文件在哪里? 我认为我正在寻找类似于Python的工具,如果有帮助的话。 问题答案: 您可以使用:

  • 问题内容: 我试图弄清楚是否有任何方法可以将索引参数传递给Promise的回调函数。例如。 现在我想将数组索引参数传递为 能做到吗?请告诉我。 这是下面的代码 问题答案: 您可以为此使用闭包。 例如,在您的代码中,使用类似以下内容的代码:

  • 问题内容: 在猫鼬文档中,它经常列出某些查询运算符(如)的可选回调,但是,它没有提及回调采用的参数(参数)。他们是什么,我怎么知道? 另外,如果,等都是可选的,我想在结束时指定一个回调,我必须在传递值,或空物体或我可以只指定回调- 和软管做猫鼬知道吗? 问题答案: 对于几乎所有的猫鼬查询,所提供的函数将在文档中所述的节点回调模式 中用两个参数调用: 在Mongoose中将回调传递给查询的任何地方,