2017-12-04 7 views
-2

私はそれが最も基本的な例ではreduce()だと理解しますが、このようなもの、特に戻り行はありません。誰かがどのように動作するかを説明したり、同じ結果を返すより理解しやすい例をつけたりすることができれば幸いです。Javascript reduce() - 戻り行は何をしますか?

var line = 'abazzzzax' 
var obj = line.split('').reduce(function(p, c){ 
    return (p[c] = ++p[c] || 1, p); 
}, {}); 
console.log(obj) 
// Output => { a: 3, b: 1, z: 4, x: 1 } 
+1

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator –

+0

戻りラインは、物事の多くを行います。どの部分を理解していないのですか?それは演算子の1つですか? – Quentin

+1

本当の疑問は、実際には役に立たない(この場合のような)場合でも、人々はどこでも減らす理由です。 –

答えて

2

機能の内側部分は、次のように書き換えることができる:

var obj = line.split('').reduce(function(p, c){ 
    if (!p[c]) { 
     p[c] = 1; 
    } else { 
     ++p[c]; 
    } 
    return p; 
}, {}); 

分割アウトこの式:p[c]がまだ存在しない

p[c] = ++p[c] || 1

は、次に値undefinedあります。 ++(undefined)は、偽のステートメントであるNaNを返します。したがって、p[c]の値は1になります。p[c]が存在する場合は、値がインクリメントされてから再び割り当てられます。私の意見ではちょっと混乱しているi = ++iのようなものです。

最後に、カンマ演算子を使用すると、式を左から右に順番に実行できるため、最後の式が返されます。これは、発生を追跡するpオブジェクトです。

+0

私は '++ p [c];'は 'p [c] = ++ p [c];' –

+0

@sushanthとすると違いはないと思いますか? –

+0

いいえ、そうではありません。 –

1

reduce関数は、この例では2つの引数を取ります。 {}

cです>初期状態 - -

p各反復aの>値、ba .....

p[c] = ++p[c] || 1 //If the `key` is already available we increment it by 1 or set it to 1. 

だから我々は最初にそれを更新し、更新されたオブジェクトを含むpを返します。これはカンマ演算子によるものです。

1

文字列内の各文字の出現を数えます。

それは基本的に

if accumulator[character] exists, increase number stored in accumulator[character] by 1 (this happens if we have set it already to 1, somewhere in the past, because otherwise it will not exist) 
else set accumulator[character] to 1 (this happens when we notice a first character of a new kind) 
return accumulator object 
関連する問題