You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优雅地将含打印机列表的程序输出流转换为数组?

优雅处理打印机列表输出的方案

嘿,针对你这个处理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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:12:37