Node.js中长短数组处理差异问题:为何names与names2表现不同?如何统一行为?
首先得澄清一个关键点:你看到的不是功能差异,只是控制台的输出格式化策略不同!
先看你给出的执行示例:
names [ 'Liam', 'Noah', 'Oliver', 'Elijah', 'William', 'James', 'Benjamin', 'Lucas', 'Olivia', 'Emma', 'Ava', 'Charlotte', 'Sophia', 'Amelia', 'Isabella', 'Mia' ]
names2 [ 'Noah', 'Oliver', 'Sophia', 'Mia' ]
names .map((n)=>n+'\n') .reduce((x,y)=>x+y,'')
'Liam\n' + 'Noah\n' + 'Oliver\n' + 'Elijah\n' + 'William\n' + 'James\n' + 'Benjamin\n' + 'Lucas\n' + 'Olivia\n' + 'Emma\n' + 'Ava\n' + 'Charlotte\n' + 'Sophia\n' + 'Amelia\n' + 'Isabella\n' + 'Mia\n'
names2 .map((n)=>n+'\n') .reduce((x,y)=>x+y,'')
'Noah\nOliver\nSophia\nMia\n'
为什么会有这种差异?
Node.js(包括Firefox浏览器)的控制台为了提升长字符串的可读性,会自动把超过一定长度的字符串拆分成多个子字符串拼接的形式(带+号)展示,但这只是显示方式的区别——两个表达式运算后得到的实际字符串值是完全一致的,都是所有元素加换行符拼接后的完整字符串。
你可以自己验证:把长数组的处理结果赋值给变量,然后打印变量或者查看它的实际内容:
const longStr = names.map(n => n+'\n').reduce((x,y)=>x+y,''); // 打印完整内容 console.log(longStr); // 查看字符串长度,会发现和实际拼接后的长度一致 console.log(longStr.length);
这时候你会看到控制台输出的是完整的换行拼接字符串,而不是拆分后的形式。
如何让names的处理表现与names2一致?
其实不需要修改运算逻辑,只需要改变控制台的输出方式就行:
- 直接用console.log包裹表达式:把整个map+reduce的表达式放在
console.log()里,控制台会输出完整的字符串:console.log(names.map(n => n+'\n').reduce((x,y)=>x+y,'')); - 先赋值给变量再打印:就像上面验证的那样,先把结果存到变量里,再打印变量,控制台会展示完整内容。
- 更简洁的替代方案:用数组的
join方法代替map+reduce,代码更简洁高效,控制台展示也更直接:
这个写法和你原来的map+reduce结果完全一致,但性能更好(减少了一次遍历)。console.log(names.join('\n') + '\n');
内容的提问来源于stack exchange,提问作者J Adrian Zimmer

