我正在尝试将对象用作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')
答案 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 != true
是true
。因此,您的代码每次遇到奇数次时都会将值重置为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');