如何优雅地将含打印机列表的程序输出流转换为数组?
优雅处理打印机列表输出的方案
嘿,针对你这个处理stdout打印机列表的需求,我有几个更简洁优雅的解决方案,帮你省去多余的步骤:
方案1:正则拆分+一键过滤
直接用正则表达式匹配所有换行/回车组合来拆分字符串,再利用filter(Boolean)快速过滤空值,同时结合trim()处理每个项的前后空白:
const printers = stdout.split(/[\r\n]+/).map(p => p.trim()).filter(Boolean);
解释:
/[\r\n]+/会匹配任意连续的回车、换行字符,不管是\r\r\n还是单独的\n/\r都能处理,兼容性更好filter(Boolean)等价于过滤掉所有空字符串、null、undefined等假值,比判断printer.length更简洁
方案2:直接提取有效内容(一步到位)
如果你的输出格式比较固定,也可以用match()直接提取所有非空的打印机名称,连拆分+过滤都省了:
const printers = stdout.match(/\S.*\S|\S/g) || [];
解释:
- 正则
\S.*\S|\S会匹配:要么是以非空白字符开头、中间任意内容、非空白字符结尾的字符串(处理带空格的打印机名),要么是单个非空白字符(处理类似Fax这种短名称) - 加上
|| []是为了防止match()返回null(当没有匹配到内容时),保证结果始终是数组
简化你当前的代码
其实你现有的代码已经很清晰了,只是可以再简化一点点——把filter(printer => Boolean(printer.length))改成filter(Boolean)就好,因为trim()后的空字符串本身就是假值,直接过滤就行:
const printers = stdout.split('\r\r\n').map(printer => printer.trim()).filter(Boolean);
这几种方法都能得到你想要的['OneNote', 'Microsoft XPS Document Writer', 'Microsoft Print to PDF', 'Fax']结果,选你觉得最顺手的就行~
内容的提问来源于stack exchange,提问作者rel1x
相关产品推荐
相关产品推荐

