Javascript 如何使用尾部递归重写此函数
我编写了以下函数来线性化任意HTML字符串的文本内容:Javascript 如何使用尾部递归重写此函数,javascript,recursion,functional-programming,computer-science,tail-recursion,Javascript,Recursion,Functional Programming,Computer Science,Tail Recursion,我编写了以下函数来线性化任意HTML字符串的文本内容: html2text(html) { function _html2text(element, accum) { return Array.prototype.slice.call(element.childNodes).reduce((accum, node) => { return (node.nodeType === 3) ? `${accum} ${
html2text(html) {
function _html2text(element, accum) {
return Array.prototype.slice.call(element.childNodes).reduce((accum, node) => {
return (node.nodeType === 3)
? `${accum} ${node.textContent}`
: _html2text(node, accum);
}, accum);
}
const div = document.createElement('div');
div.innerHTML = html;
return _html2text(div, '');
}
但现在我无法将其转换为轨迹重现样式,以便对其进行优化。
我的问题是递归在归约中递归。
我将把它写成循环,但我一直无法递归它,这让我很难受
这是我的循环版本:
function html2text(html) {
var div = document.createElement('div');
div.innerHTML = html;
var accum = '';
var stack = [];
stack.push([div, 0]);
while (stack.length !== 0) {
var frame = stack.pop();
var el = frame[0];
var i = frame[1];
for (; i < el.childNodes.length; i++) {
var node = el.childNodes[i];
if (node.nodeType === Node.ELEMENT_NODE) {
stack.push([el, i+1]);
stack.push([node, 0]);
break;
} else if (node.nodeType === Node.TEXT_NODE) {
accum += ' ' + node.textContent;
}
}
}
return accum;
}
函数html2text(html){
var div=document.createElement('div');
div.innerHTML=html;
累计风险值=“”;
var堆栈=[];
堆栈推送([div,0]);
while(stack.length!==0){
var frame=stack.pop();
var el=帧[0];
var i=帧[1];
对于(;i
下面是上面使用递归尾部调用编写的函数,传递堆栈:
function html2text(html) {
function recurse(stack, accum) {
if (!stack.length) {
return accum;
}
var frame = stack.pop();
var el = frame[0];
var i = frame[1];
for (; i < el.childNodes.length; i++) {
var node = el.childNodes[i];
if (node.nodeType === Node.ELEMENT_NODE) {
stack.push([el, i+1]);
stack.push([node, 0]);
break;
} else if (node.nodeType === Node.TEXT_NODE) {
accum += ' ' + node.textContent;
}
}
return recurse(stack, accum)
}
var div = document.createElement('div');
div.innerHTML = html;
var stack = [];
stack.push([div, 0]);
return recurse(stack, '');
}
函数html2text(html){
函数递归(堆栈,累计){
如果(!stack.length){
返回累计;
}
var frame=stack.pop();
var el=帧[0];
var i=帧[1];
对于(;ifunction html2text(current, text = "") {
"use strict";
if (current === null) return text;
var nextNode = current.nextSibling || current.parentNode.nextSibling,
more = current.nodeType === 3 ? current.textContent : "";
return html2text(nextNode, text + more);
}