【问题标题】:I need help figuring out why I'm getting NaN in this function我需要帮助弄清楚为什么我在这个函数中得到 NaN
【发布时间】:2018-07-07 15:33:03
【问题描述】:

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

【问题讨论】:

  • 因为!str[i] in finalObj(!str[i]) in finalObj 相同。
  • (!str[i] in finalObj)更改为(!(str[i] in finalObj))

标签: javascript nan


【解决方案1】:

为什么值会显示为 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"));

【讨论】:

    【解决方案2】:

    请注意,有很多方法可以解决问题,所有这些方法都取决于您需要的函数有多健壮。

    为简单起见,不要使用if(!str[i] in finalObj),而是使用if (!(str[i] in finalObj))

    【讨论】:

      【解决方案3】:

      你可以像这样简化你的代码

      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"));

      【讨论】:

      • 我不推荐这种方式,它不是很向前兼容(如果finalObj[str[i]] == 0
      • 它只是检查属性是否已经存在。如果未定义,它将返回 false。 {} 将返回 false,因为该属性不存在。
      • 如果它是未定义的,它将返回false,false,null,0...(许多falsey值)在这种情况下,我不推荐它,因为0 false-ness
      • @Joven28 不,它会为其他内容返回 false,例如 0,如上所述。
      • 我知道 false == 0。但是由于属性的初始值为 1,所以它不可能遇到 finalObj[str[i]] == 0。你能解释一下为什么会这样吗?可能会遇到 finalObj[str[i]] == 0?。对不起,我只是无法理解:)
      【解决方案4】:

      怎么样?

      let string = 'SomeWord';
      
      const result = string.split('').reduce((a, b) => {
        a[b] ? a[b]++ : a[b] = 1
        return a;
      }, {});
      console.log(result);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-03
        • 1970-01-01
        • 1970-01-01
        • 2014-05-31
        相关资源
        最近更新 更多