【发布时间】:2017-09-23 16:03:38
【问题描述】:
我编写了一个 javascript 函数,它成功地返回了 HTML 文档中使用的所有唯一类的数组。
const elements = document.getElementsByTagName('*');
let classesUsedInHtml = htmlCollection => {
let uniqClassSelectors = [];
Array.from(htmlCollection)
.filter(element => element.classList.length > 0)
.map(element =>
element.classList.forEach(
item =>
uniqClassSelectors.includes(item)
? null
: uniqClassSelectors.push(item)
)
);
return uniqClassSelectors;
};
console.log(classesUsedInHtml(elements));
我想使用Array.prototype.reduce() 重构这个函数,并跳过定义变量uniqClassSelectors 的需要,但一直无法使其工作。
这是我的重构函数不起作用(返回accumulator is undefined)。在这方面,我经常被reduce() 绊倒。为什么accumulator 未定义?我在reduce() 函数中没有正确使用forEach() 吗?谁能在这里指出我正确的方向?谢谢!
let classesUsedInHtml = htmlCollection => {
return Array.from(htmlCollection)
.filter(element => element.classList.length > 0)
.reduce((accumulator, element) => {
return element.classList.forEach(
classSelector =>
accumulator.includes(classSelector)
? accumulator
: accumulator.concat(classSelector)
);
}, []);
};
编辑:由于 Nina Scholz 的评论,从相关函数中删除了不必要的 map()
【问题讨论】:
-
如果不取返回值,为什么要映射(在第一个代码中)?第二个不返回你想要的
forEach。它只返回未定义的。 -
好消息@NinaScholz。我将更新上面的问题功能。但这并不能解决根本问题。
标签: javascript arrays foreach