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}), {});