JavaScript forEach()方法混乱

时间:2017-11-07 20:56:24

标签: javascript arrays node.js foreach

在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)

2 个答案:

答案 0 :(得分:3)

尝试:

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

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

修改

在您编辑代码之后,对于forEach回调的数组和第二个参数都使用名称copy(为什么你需要forEach回调的第二个参数 - 顺便说一下 - 这是索引,而不是"复制" - 无论你的意思是什么副本:P)。

因此,您收到的错误是Number.prototype没有名为includes()的方法,这是正确的,因为索引是Number

总结一下:

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

答案 1 :(得分:1)

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

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