Nodejs 代码未按预期执行

Posted

技术标签:

【中文标题】Nodejs 代码未按预期执行【英文标题】:Nodejs code is not executing as expected 【发布时间】:2018-12-23 22:46:11 【问题描述】:

我正在尝试下面的代码行。我想在外部while循环的每次迭代后将numbers保存在一个名为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();

【问题讨论】:

这里没有同步/异步。 您要存储index 值还是value 这句话背后的逻辑是什么? index = numbers.indexOf(Math.max(...numbers)); 这伴随着numbers[index] = 0; 肯定会取代那个值。这是你的意图吗?您的代码的总体目的是什么? 您要将完整的numbers 数组保存到sn 还是numbers 中的所有值? 是的@Adelin 我想用零替换数字。在 for 循环结束时,它将生成一个数组 numbers,我想将其保存到数组 sn 【参考方案1】:

这里与同步或异步无关。

这里发生的事情是,您正试图将“numbers”数组推送到“sn”数组。

语句是“sn.push(numbers);”

所以在这里我们将数字数组的对象引用推送到“sn”,这意味着您没有制作数字数组的副本并推送到“sn”。 您只是在推送“数字”数组的内存引用。

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

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

所以在这里你应该做的是在每次迭代期间创建一个“数字”数组的克隆。

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

var cloneArray = numbers.slice(0);

sn.push(cloneArray);

【讨论】:

【参考方案2】:

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

如果您试图查看一个数组是否包含子数组。 Mild Fuzz 在此堆栈溢出中的答案:javascript array contains/includes sub array 应该可以工作。

【讨论】:

if (sn.includes(numbers)) check = false ; 此行执行并产生预期结果。在while循环的每次迭代之后,都会生成一个数组numbers,我想每次将该数组推入另一个数组sn。所以最后我得到了一个数组sn,它包含所有以前的numbers数组作为每个元素。 感谢@Sasha,它有帮助。

以上是关于Nodejs 代码未按预期执行的主要内容,如果未能解决你的问题,请参考以下文章

字符串格式 %02d 未按预期执行?啥会导致以下代码不打印截断的两位数形式?

PHP is_int 未按预期执行

NodeJS:承诺上的 Eslint 错误

NodeJS Express 异步/等待

执行 .Then() 承诺 NodeJS

Specflow 场景大纲未按预期工作