在过去,我已经解决了下面这个问题的问题,我通过将对象键分配给当前值或0,然后每次再次出现该字母时添加1来计算字母出现在字符串中的次数。请参阅下面我参考的行。
var letterCount = function(str) {
noPuncStr = str.replace(/[^a-z]/ig, "")
// noPuncStr = str.replace(/[^\w]/ig, "") //same thing except underscores would be allowed
// console.log(noPuncStr);
var result = {};
for (var i = 0; i < noPuncStr.length; i++) {
result[noPuncStr[i]] = (result[noPuncStr[i]] || 0) + 1 //THIS LINE. I set the key to its current value if truthy or 0 then add 1
}
return result;
}
console.log(letterCount("a%b& c*da"));
我刚刚完成了类似的问题,我试图做同样的事情,除了我想设置一个键给自己或一个空数组,如果错误,然后将当前值推送到键的结果。但是当我这样做时,我得到了一个TypeError :( result [value] || [])。push不是一个函数。基于查看问题的其他答案,我意识到我可以通过将括号放在行的左端而不是将其放在=之后将其解决,就像我在上面的letterCount问题中所做的那样。为什么会这样?为了更好地说明我正在谈论的正确解决方案,我所指的是以下几行。
Array.prototype.groupBy = function(fn) {
var result = {};
if (arguments.length === 0) {
this.forEach(function(value){
(result[value] = result[value] || []).push(value); /*WHY is the (
all the way on the left of the line instead of after the equals sign
like in letterCount?*/
})
return result;
} else {
this.forEach(function(value){
(result[fn(value)] = result[fn(value)] || []).push(value);
})
return result;
}
}
我很感激任何帮助!
答案 0 :(得分:2)
push() 方法返回数组的长度:
示例:强>
@message.user_id = current_user.id
&#13;
如果你像这样放置括号:
var a = ['a', 'b', 'c'];
console.log(a.push('d')); //4
...然后result[value] = (result[value] || []).push('Hmm);
将成为数组的长度,这不是你想要的。
示例:强>
result[value]
&#13;
通过这样放置括号:
var result = {},
value = 'v';
result[value] = (result[value] || []).push('Hmm');
console.log(result[value]); //1
... (result[value] = result[value] || []).push('Success');
在括号内初始化为空数组(如果需要),然后将result[value]
推入其中。
示例:强>
Success
&#13;