这阵子在看牛客网上看一些编程题,发现有一部分的编程题是需要读取用户输入,并输出结果的。在我开发前端以来,使用 JS 读取用户输入的内容好像从没用过。所以一开始的我一头雾水。网上有介绍说 Node 的方法 readline 可以逐行读取用户输入信息。于是便在此对 readline 方法进行总结

readline 使用

1
2
3
4
5
6
7
8
9
10
11
12
// 1.引入readline模块
const readline = require('readline')
// 2.创建 Interface 类的实例
const rl = readline.createInterface({
input: process.stdin, // 输入的流
output: process.stdout, // 输出的流
})
// 监听line事件,读取用户输入的一行内容(用户敲回车键之前的所有内容)
rl.on('line', function (input) {
// input便是用户输入的一行内容
console.log(`接收到:${input}`)
})

用户输入的内容通过上述代码便可以获取到了。而在编程题中还需要得到输出,通常情况下 console.log()在控制台打印的结果也就是输出的结果。也就是说在上面的代码中 console.log()内放置你实现的函数代码。将用户输入作为参数传递就可以了。
这里贴上我实现的一道最小公倍数的数学题方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
const readline = require('readline')

const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
})

rl.on('line', function (line) {
const nums = line.split(' ')
console.log(getMinNum(parseInt(nums[0]), parseInt(nums[1])))
})

/**
* 通过num1和num2,返回num1和num2的最小公倍数
* 例:5 7 输出35
* @param {Number} num1
* @param {Number} num2
* @returns
*/
var getMinNum = function (num1, num2) {
let aIn = [],
bIn = [],
maxIn = 0,
maxNum = 0
for (let i = 1; i < Math.ceil(Math.sqrt(num1)); i++) {
if (num1 % i === 0) {
aIn.push(i)
}
}
for (let j = 1; j < Math.ceil(Math.sqrt(num2)); j++) {
if (num2 % j === 0) {
bIn.push(j)
}
}

const length = Math.min(aIn.length, bIn.length)
for (let p = 0; p < length; p++) {
if (aIn[p] === bIn[p]) {
maxIn = aIn[p]
}
}
maxNum = (num1 / maxIn) * (num2 / maxIn) * maxIn
return maxNum
}

在读取用户输入内容的过程中,程序不会停止,也就是在命令行里一直监听用户的输入。想要关闭监听用户的输入,可以使用 rl 的 close 方法:

rl.close()