2017-02-25 23 views
0

I与えられた文字列の各単語の数をカウントするために、次のコードを持っている:は、オブジェクト内の値のインスタンスを数える(array.reduceの初期値)

function countWords(str) { 
    if (str === "") { 
    return {}; 
    } 
    var holder = str.split(" "); 
    var holder1 = holder.reduce(function (allNames, name) { 
    if (name in allNames) { 
     allNames[name]++; 
    } 
    else { 
     allNames[name] = 1; 
    } 
    return allNames; 
    }, {}); 
    return holder1; 
} 

countWords("Here I I am here here"); 

私はコード内で起こっているすべてを理解私は空のオブジェクトを持っていない限り、私のテストのどれも通過しない理由を理解できません{}カンマの後に18行目に位置しています。誰かがこれの目的を説明できますか?前もって感謝します。

+0

*低減するオプションの第2引数はアキュムレータまたは* previousValue *の初期値であり、[* ECMA-262 *]を参照(HTTP:// ECMAインターナショナル.org/ecma-262/7.0/index.html#sec-array.prototype.reduce)または[* MDN *](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ Global_Objects/Array/Reduce)。 – RobG

答えて

0

そのreduceが定義されている方法、documentationに従ってため:

array.reduce(コールバック、〔はinitialValue])

callbackは、アレイ内の各値に対して実行するコールバック関数であります4つの引数を取る:

アキュムレータ: 累積値以前Rコールバックの最後の呼び出し時に返されます。指定された場合はinitialValueです。

currentValue: 現在の要素が配列内で処理されています。

currentIndex: 配列内で処理されている現在の要素のインデックス。 initialValueが指定されている場合はインデックス0から開始し、それ以外の場合はインデックス1から開始します。

配列: 配列reduceが呼び出されました。

が、ここで重要なヒントこれです:

は、コールバックが呼び出された最初の時間、アキュムレータとcurrentValueは、2つの値のいずれかになります。 reduceの呼び出しでinitialValueを指定すると、accumulatorはinitialValueと等しくなり、currentValueは配列の最初の値と等しくなります。

initialValueが指定されなかった場合、accumulatorは配列の最初の値と等しくなり、currentValueは2番目の値と等しくなります。あなたのコード内

holder varがある:

holder = ["Here", "I", "I", "am", "here", "here"] 

我々は(18行目で設定)、空のオブジェクト{}としてinitialValueを指定したとき、我々は最初の反復でこれを持っている:

allNames = {}, name = "Here" 

allNamesとして開始するのは配列で、allNames[name]を正しく使用して各単語の繰り返し数をカウントできます。

しかし、我々は初期値を省略した場合、その後、最初の反復では、我々が持っているでしょう:

allNames = "Here", name = "I" 

このシナリオでは完全に間違っています。

+0

あなたにはそれが明確でしたか?あなたのフィードバックは何ですか? –

0
  • reduce methodの構文はarr.reduce(callback, [initialValue]);

  • コールバック関数では、あなたは大丈夫です、あなたの関数でちょうど2つのパラメータを使用しているaccumulator, currentValue, currentIndex and array

  • ある4つの引数を取ることができます。

    アキュムレータ - あなたは、コールバック currentValueはの最後の呼び出しから返されたどのような値を保持するためのものであるが - あなたは、その後、initialValueを使用していなかった場合は

  • を処理されている現在の値を保持するためのものです最初の反復、accumulatorは、配列の最初の値を保持します。この場合、文字列は"Here"です。

var sum = ["a"].reduce(function(acc, val) { 
 
    return acc; 
 
}); 
 
console.log(sum);

  • あなたがinitialValueを使用してobject literal {}に設定した場合、最初の反復のために、accumulatorは値initialValueを保持します。

var sum = ["a"].reduce(function(acc, val) { 
 
    return acc; 
 
}, 5); 
 
console.log(sum);

関連する問題