【问题标题】:How to loop an array with loop time double the array length/size如何循环一个数组,循环时间是数组长度/大小的两倍
【发布时间】:2021-10-25 06:41:31
【问题描述】:

如何循环遍历一个包含固定元素的字符数组(在我的情况下是数组中的 4 个项目)n 次(对于 n 可以更改)?我正在尝试使用 setTimeout 和 \r 制作微调器,初始代码为:

setTimeout(() => {
  process.stdout.write('\r|   ');
}, 100);

setTimeout(() => {
  process.stdout.write('\r/   ');
}, 300);

setTimeout(() => {
  process.stdout.write('\r-   ');
}, 500);

setTimeout(() => {
  // Need to escape the backslash since it's a special character.
  process.stdout.write('\r\\   '); 
}, 700);

但我想增加微调器的运行时间,更简单的方法是再次复制和粘贴这些行并增加延迟时间参数。但是,我试图通过使用循环来缩短它并提出这个(只是测试数组的输出,尚未在循环中实现 setTimeout):

const char = ['|', '/', '-', '\\'];
// want to repeat the char 2 times for longer run
const nRun = char.length * 2;
for (let i = 0; i < nRun; i++){
  console.log(char[i]);
}

但是 array.length 只有 4,如果我这样做,它将在第 5->8 次循环中输出 undefined。是否可以将这些代码放入循环中?

先谢谢你了。

【问题讨论】:

  • *简单的方法-.-!对不起
  • 您可以使用Edit修正您的错字

标签: javascript node.js arrays loops settimeout


【解决方案1】:

您必须使用余数运算符 (%) 才能像循环一样在数组中循环:

const char = ['|', '/', '-', '\\'];
// want to repeat the char 2 times for longer run
const nRun = char.length * 2;
for (let i = 0; i < nRun; i++){
  console.log(char[i % 4]); // <= change here
}

余数运算符 (%) 返回一个操作数除以第二个操作数时的余数。

您可以在此处了解有关此运算符的更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Remainder

【讨论】:

  • 谢谢。我从没想过可以在循环中以这种方式使用 % 使其再次运行。
【解决方案2】:

使用的其他答案 %4

或者,您可以将数组加倍:

char = char.concat(char)

let char = ['|', '/', '-', '\\'];
// want to repeat the char 2 times for longer run
const nRun = char.length * 2;
char = char.concat(char)
for (let i = 0; i < nRun; i++){
  console.log(char[i]);
}

【讨论】:

    【解决方案3】:

    其实你可以使用字符串,因为字符串是可迭代的。

    const char = '|/-\\';
    // want to repeat the char 2 times for longer run
    const nRun = char.length * 2;
    for (let i = 0; i < nRun; i++){
      console.log(char[i%4]);
    }

    您还可以在从字符串转换的数组上使用 .forEach():

        const char = '|/-\\';
        for (let i = 0; i < 2; i++) Array.from(char).forEach((c,j) => setTimeout(()=>console.log(c),i*1000+j*250));

    【讨论】:

    • 非常感谢您的帮助以及使用 .forEach() 的额外解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-23
    • 1970-01-01
    • 2020-05-04
    相关资源
    最近更新 更多