和
let str = "baaabbabbsbsssssabbaaaa";
有了这个
[...str].reduce((characterMap, char) => {
if (!characterMap[char]) characterMap[char] = 1;
else characterMap[char]++;
return characterMap;
}, {})
我得到 { b: 8, a: 9, s: 6 }
但是当我把它缩短到这个时,
[...str].reduce((characterMap, char) => !characterMap[char] ? characterMap[char] = 1 : characterMap[char]++, {});
它打印出 1 而不是 { b: 8, a: 9, s: 6 }
为什么?
我首先使用 reduce 是错误的吗?
我如何缩短这个?
经过:
不要试图将它硬塞到一个reduce
. :-)reduce
在累加器值改变时适当使用。在你的情况下,它没有。
不使用数组包装器。字符串是可迭代的,所以直接使用这个事实。
如果不存在,则使用功能强大的||
运算符¹ 来默认字符数。
只需使用循环:
const characterMap = {};
for (const char of str) {
characterMap[char] = (characterMap[char] || 0) + 1;
}
现场示例:
let str = "baaabbabbsbsssssabbaaaa";
const characterMap = {};
for (const char of str) {
characterMap[char] = (characterMap[char] || 0) + 1;
}
console.log(characterMap);
但是如果你真的想使用reduce
,你可以应用这个||
技巧并使用一个较短的名称:
const characterMap = [...str].reduce((acc, ch) => {
acc[ch] = (acc[ch] || 0) + 1;
return acc;
}, {});
现场示例:
let str = "baaabbabbsbsssssabbaaaa";
const characterMap = [...str].reduce((acc, ch) => {
acc[ch] = (acc[ch] || 0) + 1;
return acc;
}, {});
console.log(characterMap);
您可以(ab)使用逗号运算符将其强制转换为简洁的箭头函数,但代价是可读性和可维护性(恕我直言)。
但是当我把它缩短到这个时,
[...str].reduce((characterMap, char) => !characterMap[char] ? characterMap[char] = 1 : characterMap[char]++, {});
它打印出 1 而不是 { b: 8, a: 9, s: 6 }
为什么?
因为您的回调函数返回 的结果!characterMap[char] ? characterMap[char] = 1 : characterMap[char]++
,而不是对象。因此,对它的后续调用将获得该数字,而不是该对象,并且characterMap[char]
始终为 false(因为1["a"]
isundefined
等)。
¹ (在我贫血的小博客上)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句