我需要帮助弄清楚为什么我在此功能中得到NaN

时间:2018-07-06 02:39:12

标签: javascript nan

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出现。谢谢

4 个答案:

答案 0 :(得分:5)

  

为什么值会显示为NaN

str[i]在每次迭代中代表不同的字符。当您否定像!str[i]这样的字符时,它变成false。因此,条件(if(false in finalObj))始终为false,仅执行else部分。此时finalObj[str[i]]undefined。最后,递增undefinedundefined++)得到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);