设置对象键JavaScript的值时的括号放置

时间:2016-07-14 21:47:39

标签: javascript arrays object parentheses

在过去,我已经解决了下面这个问题的问题,我通过将对象键分配给当前值或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;
  }
}

我很感激任何帮助!

1 个答案:

答案 0 :(得分:2)

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

示例:

&#13;
&#13;
@message.user_id = current_user.id
&#13;
&#13;
&#13;

如果你像这样放置括号:

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

...然后result[value] = (result[value] || []).push('Hmm); 将成为数组的长度,这不是你想要的。

示例:

&#13;
&#13;
result[value]
&#13;
&#13;
&#13;

通过这样放置括号:

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

... (result[value] = result[value] || []).push('Success'); 在括号内初始化为空数组(如果需要),然后将result[value]推入其中。

示例:

&#13;
&#13;
Success
&#13;
&#13;
&#13;