JS do ... while

3

我很抱歉,我没有理解JS中do ... while循环的行为。

假设我们有以下代码:

var a = [1,2,3,4,5];
var b = [];
var c;
do {c = a[Math.floor(Math.random()*a.length)];
    b.push(c);}
while(c===4);
console.log(b);

这段代码的意图是从数组a中随机选择一个元素,如果该元素不是4,则将其添加到数组b中。但是,如果我们多次执行此操作,我们会发现它实际上并没有阻止4进入数组b。为什么?我以为它应该像这样工作:

  1. 从数组a中随机选择一个元素,将其存储在c中,并将c推入b中;
  2. 检查(c===4)是否为true
  3. 如果是-转到第1步;
  4. 如果不是-将b记录到控制台。

我错在哪里了?为什么这段代码会以这种方式工作?如果这种方法不能帮助我,“禁止”某个元素被随机选择到数组中的其他方法是什么(除了过滤数组)?


4
你实际上已经说了:你将项目推入数组,然后才检查它是否为4以退出循环。 - Artyom Neustroev
@ArtyomNeustroev,所以,do.. while循环确实按照我发布的有序列表中描述的方式工作吗? - tristantzara
你期望 b 的值是什么类型的? - Xion Dark
3个回答

1

Do while循环先运行再检查。因此,它将从A获取一个随机数,将其存储在C中并推送到B,然后如果C为4,它将执行另一个循环。

因此,如果C为4,它仍将将其推送到B,但之后不会继续执行。

您可以这样做:

var a = [1,2,3,4,5];
var b = [];
var c = a[Math.floor(Math.random()*a.length)];
while (c !== 4) {
  b.push(c);
  c = a[Math.floor(Math.random()*a.length)];
}
console.log(b);

我认为这就是你想要做的事情?持续地将 A 中的随机项推送到 B 中,除非你得到结果 4,在这种情况下,退出并转到 console.log。

1

正如评论者所解释的那样,你仍然在推送4。你可以通过明确说明何时发生来避免这种情况。

var a = [1,2,3,4,5];
var b = [];
var c;
var keep_going = true;
while (keep_going) {
    c = a[Math.floor(Math.random()*a.length)];
    if (c === 4) {
        keep_going = false;
    } else {
        b.push(c);
    }
}
console.log(b);

0
所以根据你的代码编写方式,你并没有禁止将4添加到b中。你编写的代码将从a中添加一个值到b中,如果添加的值等于4,则继续从a中添加值到b中,直到最后添加的值不等于4为止。因此,你会得到类似以下的结果:
b == [1];
b == [5];
b == [4,1];
b == [4,4,4,4,4,4,3];

由于do-while是一种循环机制,我假设您想要不断尝试将a的值加到b中,直到找到一个不为4的值。代码如下:

var a = [1,2,3,4,5],
    b = [],
    c;
do {
    c = a[Math.floor(Math.random()*a.length)];
    if(c!==4) { b.push(c); }
} while(c===4);
console.log(b);

这将为b产生以下值:

b == [1];
b == [2];
b == [3];
b == [5];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接