簡體   English   中英

JavaScript對象作為計數器未遞增

[英]JavaScript Object as counter not incrementing

我正在嘗試使用對象作為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')

這將無法按照您希望的方式工作:

 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) => ba)[0] } console.log(findMaxRepeatCountInWord('expected')) 

您還可以使用以下方法節省排序成本:

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

您需要按以下方式檢查屬性: 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; } 

多數民眾贊成在另一個版本的JS比較有趣:

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

如果將數字和布爾值進行比較,則布爾值將變成數字(0-> false,1-> true),然后進行相等比較,因此只有1等於true 因此,如果達到2 ,它將再次進入第一個分支並將計數器重置為1

除了if-condition外,您的代碼是正確的: if(letterCount[v] != true)

解決方案:您只需將條件更改為以下即可輕松解決問題: if(letterCount[v] == undefined)

問題:在以下情況下,條件按預期工作:

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

但是當letterCount[v]大於1時,該條件再次為true,因為2 != truetrue 因此,您的代碼每次遇到奇數次時都會將值重置為1

為了說明這一點,如果我們在只有兩個e的單詞上運行您的代碼,我們將獲得:

findMaxRepeatCountInWord('expectd')
> 2

但是,如在您的示例中,如果字母第三次出現,該數字將重置為1

性能不過,這種方法在計算上不是很有效。 對於一些關於類似問題的有效解決方案的討論,您可能需要看一下該問題

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

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) => ba)[0] } findMaxRepeatCountInWord('super expected'); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM