【问题标题】:Javascript Object Iteration with for loop带有 for 循环的 Javascript 对象迭代
【发布时间】:2017-02-15 23:49:08
【问题描述】:

我正在尝试计算唯一字符在字符串中出现的次数。 但我被困在对象迭代中,无论同一个字符出现多少次,它都只返回 1:

function allUniqueCha(word) {
  var wordObj = {};
  var wordArray = word.split([, ]);
  wordArray.forEach(function(c) {
    wordObj[c] = +1;
  });
  console.log(wordArray);
  console.log(wordObj);
}

allUniqueCha("Bubble")

输出为:{B:1, u:1,b:1,l:1,e:1} 但键“b”的预期值应为 2。

【问题讨论】:

  • wordObj[c]的初始值是多少?将+1 分配给它会发生什么?

标签: javascript object iteration hashtable


【解决方案1】:

你写道:

 wordObj[c]=+1;

有一些格式:

 wordObj[c] = +1;

您总是将+1 分配给该值,这里没有增量。试试

 wordObj[c] = (wordObj[c] || 0)+1;

还有

var wordArray = word.split([, ]);

应该比较

var wordArray = word.split("");

function allUniqueCha(word) {
  var wordObj = {};
  var wordArray = word.split("");
  wordArray.forEach(function(c) {
    wordObj[c] = (wordObj[c] || 0) +1;
  });
  console.log(wordArray);
  console.log(wordObj);
}

allUniqueCha("Bubble")

【讨论】:

    【解决方案2】:

    当你这样做时:

    wordObj[c] = +1;
    

    您正在为属性分配值 +1。你想要做的是将值增加 1,所以:

    wordObj[c] += 1;
    

    但是,最初 wordObj[c] 不存在,因此您尝试增加 undefined,这将引发错误。所以你必须测试该属性是否存在,如果不存在,则创建它并对其进行初始化。

    function allUniqueCha(word) {
      var wordObj = {};
      var wordArray = word.split([, ]);
      wordArray.forEach(function(c) {
        if (!wordObj.hasOwnProperty(c)){
          wordObj[c] = 0;
        }
        wordObj[c] += 1;
      });
      console.log(wordArray);
      console.log(wordObj);
    }
    
    allUniqueCha("Bubble")

    你也可以使用reduce

    function allUniqueCha(word) {
      return word.split('').reduce(function(acc, c) {
        acc[c] = (acc[c] || 0) + 1;
        return acc;
      },{});
    }
    
    console.log(allUniqueCha("Bubble"));

    【讨论】:

      【解决方案3】:

      这篇文章牵涉到您最初发帖的思路。这是解决您正在寻找的问题的一种方法。

      function allUniqueCha(word){
        let wordArray = word.split([,]);
        return wordArray.reduce((result, element) => {
          result[element] = result[element] + 1 || 1;
          return result;
        }, {})
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-08
        • 2013-10-15
        • 2019-12-08
        • 2014-11-29
        相关资源
        最近更新 更多