我寫了一個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。我會更新上面的問題函數。但那不會解決潛在的問題。 –