【问题标题】:JavaScript forEach() method confusionJavaScript forEach() 方法混淆
【发布时间】:2018-04-20 09:46:32
【问题描述】:

在 Ubuntu 中使用 nodejs。我一直在阅读有关 JavaScript forEach() 方法的 MDN 文档。我知道还有其他方法可以做到这一点,但我边做边学;我正在尝试使数组copy 成为arr 数组中值的唯一集合;没有重复。我想使用forEach() 方法来做到这一点。

设置:

var arr = [1, 2, 3, 4, 4, 3, 2];
var copy = [];

那么为什么会这样呢?

copy.includes(1); // returns false

虽然这不是?

arr.forEach(function(element, copy) {
 if (!copy.includes(element)) {
   copy.push(element);
 }
});

这是错误:

TypeError: copy.includes is not a function
    at repl:2:11
    at Array.forEach (native)
    at repl:1:5
    at ContextifyScript.Script.runInThisContext (vm.js:23:33)
    at REPLServer.defaultEval (repl.js:339:29)
    at bound (domain.js:280:14)
    at REPLServer.runBound [as eval] (domain.js:293:12)
    at REPLServer.onLine (repl.js:536:10)
    at emitOne (events.js:101:20)
    at REPLServer.emit (events.js:191:7)

【问题讨论】:

标签: javascript arrays node.js foreach


【解决方案1】:

forEach 回调的第二个参数是索引,通过将副本作为第二个参数,您得到的是索引,而不是之前声明的数组。所以你想要做的是0.includes 这实际上不是一个函数。删除第二个参数将解决您的问题

arr.forEach(function(element) {
 if (!copy.includes(element)) {
copy.push(element);
}
});

【讨论】:

  • 成功了;我现在明白我是如何误解文档的了。为什么 MDN 文档对新手如此不友好?我花了两个小时阅读forEach() 方法。
【解决方案2】:

试试:

arr.forEach(function(element) {
 if (!copied.includes(element)) {
   copied.push(element);
 }
});

forEach 回调的第二个参数是索引,而不是您要填充的数组。此外,根据您的代码示例,您引用了copy,即undefined,而正确的变量名为copied

编辑

在编辑完代码后,您将名称 copy 用于数组和 forEach 回调的第二个参数(为什么您需要 forEach 回调的第二个参数 - 顺便说一下 - 是索引,而不是“复制” -不管你是什么意思:P)。

因此,您会收到一个错误,即 Number.prototype 没有名为 includes() 的方法,这是真的,因为索引是 Number

总结一下:

arr.forEach(function(element) {
 if (!copy.includes(element)) {
   copy.push(element);
 }
});

【讨论】:

  • 请查看编辑。唯一值数组始终称为copy。那是我的编辑错误;我很抱歉。
  • 您命名的 2 个变量完全相同。您不能将 forEach 回调的第二个参数也称为 copy
  • @SeanValdivia 你还没有解决问题。你有copy这里没有明显的原因:function(element, copy) <----
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-25
  • 1970-01-01
  • 1970-01-01
  • 2013-03-01
  • 2011-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多