function multipleLetterCount(str){
var finalObj = {};
for(var i = 0; i < str.length; i++){
if(!str[i] in finalObj){
finalObj[str[i]] = 1;
} else {
finalObj[str[i]]++;
}
}
return finalObj;
}
console.log(multipleLetterCount("SomeWord"));
我需要帮助弄清楚为什么值会以NaN出现。谢谢
答案 0 :(得分:5)
为什么值会显示为NaN
str[i]
在每次迭代中代表不同的字符。当您否定像!str[i]
这样的字符时,它变成false
。因此,条件(if(false in finalObj)
)始终为false
,仅执行else
部分。此时finalObj[str[i]]
是undefined
。最后,递增undefined
(undefined++
)得到NaN
。
尝试使用Object.prototype.hasOwnProperty()
,该方法返回一个布尔值,该布尔值指示对象是否具有指定的属性作为其自身的属性:
function multipleLetterCount(str){
var finalObj = {};
for(var i = 0; i < str.length; i++){
if(!finalObj.hasOwnProperty(str[i])){
finalObj[str[i]] = 1;
} else {
finalObj[str[i]]++;
}
}
return finalObj;
}
console.log(multipleLetterCount("SomeWord"));
答案 1 :(得分:0)
您可以像这样简化代码
function multipleLetterCount(str){
var finalObj = {};
for(var i = 0; i < str.length; i++){
if (finalObj[str[i]]) {
finalObj[str[i]]++;
} else {
finalObj[str[i]] = 1;
}
}
return finalObj;
}
console.log(multipleLetterCount("SomeWord"));
答案 2 :(得分:0)
请注意,有很多方法可以解决问题,所有方法都取决于您需要的功能的健壮性。
为简单起见,请执行if(!str[i] in finalObj)
而不是if (!(str[i] in finalObj))
。
答案 3 :(得分:0)
怎么样?
let string = 'SomeWord';
const result = string.split('').reduce((a, b) => {
a[b] ? a[b]++ : a[b] = 1
return a;
}, {});
console.log(result);