Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/441.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
Javascript 我的程序使用array::forEach,但不使用for循环_Javascript_Arrays_Recursion_Foreach - Fatal编程技术网

Javascript 我的程序使用array::forEach,但不使用for循环

Javascript 我的程序使用array::forEach,但不使用for循环,javascript,arrays,recursion,foreach,Javascript,Arrays,Recursion,Foreach,考虑以下代码 使用数组进行编码。forEach调用。 输出 它console.log是正确的输出(更准确地说,是几乎正确的结果,因为存在冗余:每个元素重复3次-但是情况不应该如此,因为forEach(element)将element的值从一次迭代更改为另一次迭代,显然……) 相同的代码,带有for循环。 我的问题 我有两个问题 1) 首先,为什么带有forEach的代码每个元素显示三次 2) 第二个问题:为什么两个程序显示的结果不同?问题: 相同的数组会被重复 这是因为在迭代时不获取数组的副本。

考虑以下代码

使用数组进行编码。forEach调用。 输出 它
console.log
是正确的输出(更准确地说,是几乎正确的结果,因为存在冗余:每个元素重复3次-但是情况不应该如此,因为
forEach(element)
element
的值从一次迭代更改为另一次迭代,显然……)

相同的代码,带有
for
循环。 我的问题 我有两个问题

1) 首先,为什么带有
forEach
的代码每个元素显示三次

2) 第二个问题:为什么两个程序显示的结果不同?

问题:

相同的数组会被重复

这是因为在迭代时不获取数组的副本。您可以在递归调用中执行
slice
,但这还不够。当您处于最深的递归级别时,首先在数组的最后一个条目中写入“a”,将其推送到结果上,然后在同一内存位置中写入“b”。因此,您实际上更改了已推送的数据,同时也再次添加了它。现在你有两倍相同的结果。放置“c”时也会发生同样的情况:更改先前添加的两个结果。它们都是同一数组中的三个

因此,将
slice
(仅适用于)应用于传递给
push
方法的参数:

all_combinations.push(combination_being_constructed.slice());
第二个代码不会产生很多结果

这是因为在JavaScript中,如果不使用
var
let
const
关键字显式声明变量,它将在全局范围内隐式声明,从而在递归函数调用中共享。在最深的递归级别,它迭代到数组的末尾,递归树中所有挂起的循环现在也将退出,因为它们都共享相同的
i
变量

通过在函数范围(或块范围)中声明
i
来修复此问题。使用:

for(设i=0;i

一种简单的方法可以检测您是否是意外地这样做的,就是将
置于“使用严格”;
位于代码文件或函数的顶部,它将抛出控制台错误,而不是在全局范围内隐式声明变量。

一个主要问题:您没有将
i
定义为局部变量,因此它在递归调用中共享。一旦一个循环结束,递归树中的所有变量都将结束。Do
 for(let i=
…等。谢谢你,你应该写这篇文章作为答案:)但是,它回答了我的第二个问题,而不是第一个问题(它涉及'for(let i)`和
forEach
,它显示了三次,因为
if(data\u cursor==data.length-1)
不随forEach而变化,数据数组中有三项。
使用strict;
将捕获隐式全局变量
(27) [Array(3), Array(3), Array(3), Array(3), Array(3), Array(3), Array(3), Array(3), Array(3), Array(3), Array(3), Array(3), Array(3), Array(3), Array(3), Array(3), Array(3), Array(3), Array(3), Array(3), Array(3), Array(3), Array(3), Array(3), Array(3), Array(3), Array(3)]
0
:
(3) ["a", "a", "c"]
1
:
(3) ["a", "a", "c"]
2
:
(3) ["a", "a", "c"]
3
:
(3) ["a", "b", "c"]
4
:
(3) ["a", "b", "c"]
5
:
(3) ["a", "b", "c"]
6
:
(3) ["a", "c", "c"]
7
:
(3) ["a", "c", "c"]
8
:
(3) ["a", "c", "c"]
9
:
(3) ["b", "a", "c"]
10
:
(3) ["b", "a", "c"]
11
:
(3) ["b", "a", "c"]
12
:
(3) ["b", "b", "c"]
13
:
(3) ["b", "b", "c"]
14
:
(3) ["b", "b", "c"]
15
:
(3) ["b", "c", "c"]
16
:
(3) ["b", "c", "c"]
17
:
(3) ["b", "c", "c"]
18
:
(3) ["c", "a", "c"]
19
:
(3) ["c", "a", "c"]
20
:
(3) ["c", "a", "c"]
21
:
(3) ["c", "b", "c"]
22
:
(3) ["c", "b", "c"]
23
:
(3) ["c", "b", "c"]
24
:
(3) ["c", "c", "c"]
25
:
(3) ["c", "c", "c"]
26
:
(3) ["c", "c", "c"]
length
:
27
var data = ['a', 'b',  'c'];
var all_combinations = [];

function recursiveGetAllCombinations(data_cursor = 0, combination_being_constructed = []) {

    for(i = 0; i < data.length; i++) {
    combination_being_constructed[data_cursor] = data[i];
    if(data_cursor == data.length - 1) {
        all_combinations.push(combination_being_constructed);      
    } else {
        recursiveGetAllCombinations(data_cursor + 1, combination_being_constructed.slice());
    }
  }

}

recursiveGetAllCombinations();
console.log(all_combinations);
(3) [Array(3), Array(3), Array(3)]
0
:
(3) ["a", "a", "c"]
1
:
(3) ["a", "a", "c"]
2
:
(3) ["a", "a", "c"]
length
:
3
all_combinations.push(combination_being_constructed.slice());
for (let i = 0; i < data.length; i++) {