JavaScript对象作为计数器未递增

时间:2018-10-27 22:23:53

标签: javascript object counter

我正在尝试将对象用作JavaScript中的计数器,以查找单词中重复次数最多的字母,但是该功能无法正常使用。例如,当我调用findMaxRepeatCountInWord('expected')时,letterCount对象最终以值{ e: 1, x: 1, p: 1, c: 1, t: 1, d: 1 }结束。我的代码有什么问题? e的值不应该为3吗?

我的代码:

function findMaxRepeatCountInWord(word){
  var letterCount = {};
  word.split('').map(function(v){
    if(letterCount[v] != true){ letterCount[v] = 1 } 
    else(letterCount[v] ++)
  });
  return Object.values(letterCount).sort((a,b) => b-a)[0]
}

findMaxRepeatCountInWord('expected')

6 个答案:

答案 0 :(得分:2)

这将不符合您的期望:

 if(letterCount[v] != true)

尝试使用!hasOwnProperty(并使用forEach而不是map)进行测试:

function findMaxRepeatCountInWord(word){
    var letterCount = {};
    word.split('').forEach(function(v){
      if(!letterCount.hasOwnProperty(v)){ letterCount[v] = 1 } 
      else letterCount[v] ++
    });
    console.log("letter counts", letterCount)
    return Object.values(letterCount).sort((a,b) => b-a)[0]
  }
  
  console.log(findMaxRepeatCountInWord('expected'))
  

您还可以使用以下方法节省排序费用:

return Math.max(...Object.values(letterCount))

答案 1 :(得分:1)

您需要按以下步骤检查属性:if (v in letterCount),这是检查键是否为对象属性的最可靠方法。

此方法返回已构建的对象

function findMaxRepeatCountInWord(word) {
  var letterCount = {};
  word.split('').map(function(v) {
    letterCount[v] = (letterCount[v] || 0) + 1;
  });
  
  return letterCount;
}

console.log(findMaxRepeatCountInWord('expected'))
.as-console-wrapper { max-height: 100% !important; top: 0; }

请注意,使用函数Array.prototype.map并不是解决此问题的最佳方法,因为您正在创建不必要的数组。

使用功能Array.prototype.reduce对字母进行分组的替代方法

function findMaxRepeatCountInWord(word) {
  return word.split('').reduce((a, c) => {
    a[c] = (a[c] || 0) + 1;
    return a;
  }, Object.create(null));
}

console.log(findMaxRepeatCountInWord('expected'))
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 2 :(得分:1)

那是JS比较乐趣的另一个版本:

 console.log(
   0 != true, // true
   1 != true, // false
   2 != true // true
   3 != true // true
);

如果您将一个数字和一个布尔值进行比较,则布尔值将变成一个数字(0-> false,1-> true),然后进行相等比较,因此只有1等于true 。 因此,如果到达2,它将再次进入第一个分支并将计数器重置为1

答案 3 :(得分:1)

您的代码是正确的,除了if条件: if(letterCount[v] != true)

解决方案: 您只需将条件更改为以下即可轻松解决问题: if(letterCount[v] == undefined)

问题: 该条件在以下情况下按预期工作:

  • letterCount[v]undefined
  • letterCount[v]1

但是当letterCount[v]大于1时,条件再次成立,因为2 != truetrue。因此,您的代码每次遇到奇数次时都会将值重置为1

举例说明,如果我们在只有两个e的单词上运行您的代码,我们将获得:

findMaxRepeatCountInWord('expectd')
> 2

但是,如在您的示例中,如果字母第三次出现,该数字将重置为1

性能 但是,这种方法在计算上不是很有效。对于有关类似问题的有效解决方案的一些讨论,您可能需要给出例如this question外观。

答案 4 :(得分:0)

function findMaxRepeatCountInWord(word){
  var letterCount = {};
  word.split('').map(function(v){
    if(letterCount[v]==undefined){ letterCount[v]= 1 ;
} 
    else{letterCount[v]=letterCount[v]+1}
  });
  return Object.values(letterCount).sort((a,b) => b-a)[0]
}

var x=findMaxRepeatCountInWord('expected');
console.log(x);

答案 5 :(得分:-1)

if应该是:

if(!letterCount[v]){ letterCount[v] = 1 } 
else {letterCount[v]++}

要保持对代码的最少修改。其他答案可以进一步完善。


应用于OP代码:

function findMaxRepeatCountInWord(word){
  var letterCount = {};
  word.split('').map(function(v){
    if(!letterCount[v]){ letterCount[v] = 1 } 
    else(letterCount[v] ++)
  });
  console.log(letterCount)
  return Object.values(letterCount).sort((a,b) => b-a)[0]
}

findMaxRepeatCountInWord('super expected');