Javascript 以对象作为累加器的数组reduce
与 用这个Javascript 以对象作为累加器的数组reduce,javascript,Javascript,与 用这个 let str = "baaabbabbsbsssssabbaaaa"; 我得到{b:8,a:9,s:6} 但是当我把它缩短到这个 [...str].reduce((characterMap, char) => { if (!characterMap[char]) characterMap[char] = 1; else characterMap[char]++; return characterMap; }, {}) 它打印出1而不是{b:8,a:
let str = "baaabbabbsbsssssabbaaaa";
我得到{b:8,a:9,s:6}
但是当我把它缩短到这个
[...str].reduce((characterMap, char) => {
if (!characterMap[char]) characterMap[char] = 1;
else characterMap[char]++;
return characterMap;
}, {})
它打印出1而不是{b:8,a:9,s:6}
为什么?
首先,我是否使用了reduce错误?您需要获取返回的累加器作为结果
var str=“baaabbsbsssssabbaaa”,
结果=[…str].reduce((characterMap,char)=>{
characterMap[char]=(characterMap[char]| | 0)+1;//默认值为零
返回字符映射;
}, {});
console.log(结果)
我如何缩短这个
作者:
reduce
:-)<当累加器值发生变化时,适当使用代码>减少。在你的情况下,它不是
[...str].reduce((characterMap, char) => !characterMap[char] ? characterMap[char] = 1 : characterMap[char]++, {});
实例:
let str=“baaabbsbsssssabbaaa”;
常量characterMap={};
for(str的常量字符){
characterMap[char]=(characterMap[char]| | 0)+1;
}
console.log(characterMap)代码>如果要坚持使用箭头表达式语法,可以使用:
或者您可以使用:
请添加您得到的和想要的。将其缩短为什么?一行?这使得它更不可读。我更新了它。简单循环更简单,更短。啊,很好的技巧。因此,这是一种以单行形式返回原始obj的方法,在这两种情况下,表达式都返回characterMap
(在它发生变异后)的值。这就是为什么发布so比谷歌搜索更有帮助。否则我就不会知道逗号的把戏了。thanksI不确定何时使用reduce以及如何工作,但现在我知道了。thanks@totalnoob-FWIW,我不是想让你改变你接受的答案。关键是要从不同的角度(可读性、可维护性、内存搅动等)理解各种方法的后果。不管怎样,编码快乐!
const characterMap = {};
for (const char of str) {
characterMap[char] = (characterMap[char] || 0) + 1;
}
[...str].reduce((characterMap, chr) =>
(characterMap[chr] = (characterMap[chr] || 0) + 1, characterMap), {});
[...str].reduce((characterMap, chr) =>
Object.assign(characterMap, {[chr]: (characterMap[chr] || 0) + 1}), {});