Node.js代码未按预期执行

时间:2018-07-16 11:37:48

标签: javascript arrays node.js asynchronous synchronous

我正在尝试以下代码行。我想在每次外部 numbers循环迭代后将while保存在名为sn的数组中。但是,在每次迭代之后,sn仅包含上一次迭代的numbers。可能是我缺少syncasync的整个概念。

function test() {
  var numbers = [0, 2, 7, 0];
  var check = true;
  var sn = [];
  var p = 0;
  while (check) {
    var index = numbers.indexOf(Math.max(...numbers));
    var value = Math.max(...numbers);
    numbers[index] = 0;
    for (var i = value; i > 0; i--) {
      var temp = ++index;
      index = temp % (numbers.length);
      numbers[index] += 1;
    }
    console.log("numbers", numbers);
    if (sn.includes(numbers)) { check = false };
    sn.push(numbers);
    console.log("hey there=========");
  }
  

}  
test();

2 个答案:

答案 0 :(得分:4)

此处与同步或异步无关。

这是在发生什么,您正在尝试将“数字”数组推到“ sn”数组。

声明为“ sn.push(数字);”

因此,在这里我们将数字数组的Object引用推送到'sn',这意味着您没有在复制数字数组并将其推送到'sn'。 您只是在推动“数字”数组的“内存”引用。

因此,在第一次迭代期间,“ sn”将具有您计算出的确切值。

但是在第二次迭代中,“ sn”将具有两个数组。但是,这两个值是相同的,并指向“ number”的相同存储位置。

因此,这里您应该做的是在每次迭代期间创建一个'numbers'数组的克隆。

if(sn.includes(numbers)){check = false};

var cloneArray = numbers.slice(0);

sn.push(cloneArray);

答案 1 :(得分:1)

此if语句:if (sn.includes(numbers)) { check = false };永远不会为真,因为Array.prototype.includes()方法不接受数组作为参数;仅单个元素。 numbers是一个数组,因此永远不会是真实的。

如果您要查看数组是否包含子数组。轻度模糊在此堆栈中的答案溢出:Javascript array contains/includes sub array应该起作用。