我写了一个JavaScript函数,它成功返回了HTML文档中使用的所有唯一类的数组。将对象数组减少为在所有对象共享的属性中找到的唯一字符串(javascript)
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)
);
}, []);
};
编辑:取出从有问题的功能uneccessary map()
由于尼娜肖尔茨评论
为什么地图,如果你做不接受返回值(在第一个代码中)?第二个不会用'forEach'返回你想要的。它只返回undefined。 –
赶上@NinaScholz。我会更新上面的问题函数。但那不会解决潜在的问题。 –