2016-07-14 7 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 [значение] = (результат [значение] || []). push ('Hmm'); становится [] и [] .push ("hmm") становится 1. в следующем примере (результат [значение] = результат [значение] || []), result [значение] установлен на [], но когда успех вдаваясь в это, он стал успехом? почему [] .push ('hmm') возвращает 1, когда [] .push («success») дает вам [«success»] – MattGoldwater

+0

не беспокойтесь о том, чтобы ответить. выдумал. – MattGoldwater

+0

Извините, пришлось забрать мою жену. Если у вас все еще есть вопросы, дайте мне знать. –