2016-07-14 36 views
0

在过去,我已经解决了类似下面这个问题的问题,我通过将对象键分配给当前值或0来计算字母出现在字符串中的次数,然后每当字母再次出现时加1。请参阅下面的提示。设置对象键值时的括号放置JavaScript

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

我很感激任何帮助!

回答

2

push()方法返回数组的长度:

实施例:

var a = ['a', 'b', 'c']; 
 
console.log(a.push('d')); //4

如果放置这样的括号:

result[value] = (result[value] || []).push('Hmm); 

&hellip;那么result[value]就会变成数组的长度,这不是你想要的。

实施例:

var result = {}, 
 
    value = 'v'; 
 
    
 
result[value] = (result[value] || []).push('Hmm'); 
 
console.log(result[value]); //1

通过将括号这样的:

(result[value] = result[value] || []).push('Success'); 

&hellip; result[value]初始化为空数组如果需要括号内,然后Success被推入它。

例子:

var result = {}, 
 
    value = 'v'; 
 
    
 
(result[value] = result[value] || []).push('Success'); 
 
console.log(result[value]); //Success

+0

我仍然不解,为什么你是对的。哎呦会再次编辑和精心制作。这里:result [value] =(result [value] || [])。push('Hmm');在下一个例子中(result [value] = result [value] || []),result [value]被设置为[],但当成功为[]时,变成[]和[] .push(“hmm”推入它,它成为成功?为什么[] .push('hmm')返回1而[] .push(“成功”)给你[“成功”] – MattGoldwater

+0

不用担心响应。想通了。 – MattGoldwater

+0

对不起,不得不接我的妻子。如果你还有问题,请告诉我。 –