在 Javascript 中使用 reduce 从 html 标签中提取文本

Extract text from html tags using reduce in Javascript

我正在尝试使用 reduce 将我页面上每个段落标记的内部 HTML 连接成一个字符串。这是我的尝试:

// JS
let par = Array.from(document.getElementsByTagName("p"));
document.write(par.reduce((a, b) => a + ", " + b.innerHTML));
<!-- HTML -->
<p>Apple</p>
<p>Strawberry</p>
<p>Banana</p>

这是(错误的)输出:

[object HTMLParagraphElement], Strawberry, Banana

我做错了什么?

非常感谢您的帮助!

您应该为 reduce 方法传递第二个参数(初始值):

par.reduce((a,b)=>a+", "+b.innerHTML, '')

reduce 函数接受第二个参数,它是 accumulator.

的初始值

默认情况下,它是数组中的第一项。

要获得预期的结果,您应该这样编写代码:

let par = Array.from(document.getElementsByTagName("p"));
document.write(par.reduce((a,b)=>a+", "+b.innerHTML, ""));

这是来自 MDN 的关于 reduce 函数的文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce?v=a

怎么样:

let par = Array.from(document.getElementsByTagName("p"));
document.write(par.map(a=> a.innerHTML).join())

正如@hsz 所写,您应该使用空字符串累加器以使您的示例工作:

let par = Array.from(document.getElementsByTagName("p")); 
document.write(par.reduce(par.reduce((a,b) => a + ", " + b.innerHTML, '');

但您也可以先映射数组并获取 innerHTML 属性 然后再减少

let par = Array.from(document.getElementsByTagName("p")); 
document.write(par.map(a => a.innerHTML).reduce((a, b) => a + ", " + b));

一个好的解决方案是使用 map 创建一个包含段落实际内容的数组。

然后使用reduce,将空字符串作为累加器(第二个参数)传递,你可以得到内容组合的字符串。

脚本:

/* Cache the p elements found. */
let pElems = document.getElementsByTagName("p");

/* Create an array containing the innerHTML of each 'p' element. */
let par = [].map.call(pElems, (a)=>a.innerHTML);

/* Use 'reduce' to combine them (passing the emoty string as the accumulator. */
document.write(par.reduce((a, b) => a + ", " + b), "");
<!-- HTML -->
<p>Apple</p>
<p>Strawberry</p>
<p>Banana</p>

一行:

document.write([].map.call(document.getElementsByTagName("p"), (a)=>a.innerHTML).reduce((a, b) => a + ", " + b), "");
<!-- HTML -->
<p>Apple</p>
<p>Strawberry</p>
<p>Banana</p>