2016-08-15 3 views
-3

を減らして私がArray.prototype.reduce再定義することを意図され、このコードにつまずい:使用は

function first(array, n){ 
 
    return n === undefined ? array[0] : array.slice(0, n); 
 
}; 
 

 
function last(array, n){ 
 
    if(n> array.length){ 
 
    return array; 
 
    }else{ 
 
     return n === undefined ? array[array.legnth -1] : array.slice(array.length - n, array.length); 
 
     
 
}; 
 
    
 
    function map(collection, iterator){ 
 
    var arr = []; 
 
    each(collection, function(element, index){ 
 
     arr.push(iterator(element, index); 
 
    }); 
 
    return arr; 
 
    };

function reduce(collection, rf, acc) { 
    acc = acc === undefined ? first(collection) : acc; 
    return last(map(collection, function (value) { 
     acc = rf(acc, value); 
     return acc; 
    })); 
} 

をしかし、私は「ドンarray.last()がここで何をしているのか理解している。誰かが説明してくれますか?ありがとうございました。ここで

+1

配列にはネイティブ 'last'関数はありません。プロトタイプを配列に拡張していない限りあなたのコードに基づいて、 'array.last()'コールはありません。私が見ることのできるのは 'last'関数だけです。どのような最後のことは、そのJavaScriptスコープ自体で実装されています。あなたはそれを自分で見つけることができます。 – choz

+0

ここでは 'last'が定義されています –

+0

標準Javascriptではないので、' first() '、' last() 'および' map() '関数を表示しなければなりません。彼らが何をしているのか推測することができますが、推測する必要がなければ、ここでの回答はずっと優れています。また、 'array.last()'について尋ねましたが、あなたのコードにそのようなものはありません。あなたが何を求めているのか、あなたの状況を理解するために必要なすべての情報を含んだ明確な質問を書いたり編集したりしてください。今のところ、この質問は情報が不十分であるため「あなたが求めているものが不明」となっています。 – jfriend00

答えて

0
0: function reduce(collection, rf, acc) { 
1:  acc = acc === undefined ? first(collection) : acc; 
2:  return last(map(collection, function (value) { 
3:   acc = rf(acc, value); 
4:   return acc; 
5:  })); 
6: } 

は、あなたのreduce()関数内で何が起こっているかについて行ずつです:

1行目:何も値がaccのために渡されていない場合は、コレクション内の最初の値に設定します。

2行目:コレクションの各アイテムに対してrf()をコールするコールバックを呼び出し、コレクションを繰り返し処理するコレクションのmap()にコールします。 map()は、反復コールバックが呼び出されるたびに返される値のコレクションである新しい配列を作成します。結果の配列がmap()から返された場合は、配列からlast()の値を取得し、最終戻り値としてreduce()から返します。

行3:accrf(acc, value)の結果に設定します。

行4:map()が配列に挿入されるコールバックからaccを返します。

しかし、ここではarray.last()が何をしているのか分かりません。 誰か説明してください。

last(array)とすると、last(array)の機能は配列の最後の項目を取得することです。 2番目の引数をlast()に渡すと、渡した配列の最後のN個の項目が取得され、新しい配列として返されます(この2番目の機能は使用していません)。この内部配列を作成するにはポイントがありませんので、それがmap()を使用する必要がありますように


reduce()の実装はいないようです。あなたがより正確に何の初期値が選択されていない場合、配列の最初の要素は初期値として使用されArray.prototype.reduce()と模倣したい場合は

function reduce(collection, rf, initial) { 
    var acc = (initial === undefined) ? first(collection) : initial; 
    each(collection, function(value) { 
     acc = rf(acc, value); 
    }); 
    return acc; 
} 

:私は、これは、より効率的であると思うだろう配列の最初の要素に対してイテレータが呼び出されていない場合は、これを行うことができます。

function reduce(collection, rf, initial) { 
    var acc = initial, index = 0; 
    if (initial === undefined) { 
     acc = collection[0]; 
     index = 1; 
    } 
    for (; index < collection.length; ++index) { 
     acc = rf(acc, collection[index]); 
    }); 
    return acc; 
} 
+0

ありがとうございました。同意する。あなたがすでにコールバックを持っている場合は、ここでのマップの使用は冗長で不必要なようです。それぞれを使うことは理想的な方法だと思われます。 –

+0

簡単な質問 - コレクション全体を反復処理しても、コレクション[0]はありません。二度繰り返す? –

+0

@IvonneTerrero - はい、そうです。これはJavascriptの 'Array.prototype.reduce()'の振る舞いではありませんが、目的の振る舞いの仕様を提供していないので、私はそれを変更しませんでした。 – jfriend00