Node.js环境下控制台输入至指定值(不含该值)停止的实现问题
问题描述
在Node.js环境下通过控制台输入年龄,提示用户输入年龄或输入X结束操作。当前用do-while循环实现,每次输入后把值存入studentAges数组,循环在输入不等于X时继续。但现在数组会混入终止符X(比如[10,12,14,'X']),想要在输入X时停止存入,避免X进数组,而且不想用「先判断是不是X再决定要不要push」的常规写法,希望靠前置/后置条件写出更简洁的代码。
解决方案
可以利用while循环的前置条件判断,把输入操作和终止判断合并到循环条件里,这样只有输入不是X的时候,才会进入循环体执行数组存入,从根源上避免X被加入数组,写法也更简洁。
同步输入场景(用readline-sync模块)
如果用同步输入(需先安装模块:npm install readline-sync),代码示例:
const readlineSync = require('readline-sync'); const studentAges = []; // 输入+终止判断直接写在while条件里 while ((input = readlineSync.question('请输入年龄或输入X结束:')).toUpperCase() !== 'X') { studentAges.push(input); } console.log('输入结束,年龄数组:', studentAges);
异步输入场景(Node.js原生readline模块)
如果用Node.js原生的异步readline,可以用递归调用实现类似前置判断的逻辑:
const readline = require('readline'); const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); const studentAges = []; function askForAge() { rl.question('请输入年龄或输入X结束:', (input) => { // 不是X才存入并继续询问,相当于前置判断 if (input.toUpperCase() !== 'X') { studentAges.push(input); askForAge(); } else { console.log('输入结束,年龄数组:', studentAges); rl.close(); } }); } askForAge();
说明
- 同步场景的
while写法把输入、判断逻辑整合到循环条件中,循环体只负责存数组,完全符合「不用额外先判断再push」的要求,代码简洁直观。 - 异步场景因为原生
readline的异步特性,没法用常规循环实现前置判断,递归是最简洁的替代方案,同样避免了冗余判断。
内容的提问来源于stack exchange,提问作者user14487566
相关产品推荐
相关产品推荐

