2017-04-04 9 views
-1

私は練習に取り組んでいます。配列の配列から始めて、与えられたすべての配列のすべての要素を含む単一の配列に縮小と連結を使用する必要があります。Javascript:concatで縮小すると

だから私はこのことから開始します。

var array = [[1,2,3],[4,5,6],[7,8,9]] 

、私はこれで運動しを解く:

:私はこれを持って

var new_array = array.reduce(function(prev,cur){return prev.concat(cur);}) 

だから、それは動作しますが、入力にconsole.log(new_array)

[1, 2, 3, 4, 5, 6, 7, 8, 9] 

しかし、このように関数を変更した場合:

私はこのエラーが出るのはなぜ

"TypeError: prev.concat is not a function 

var new_array = array.reduce(function(prev,cur){return prev.concat(cur);},0) 

私はこのエラーを取得しますか?おかげで事前

+0

のように、アレイと0を交換するので配列を0に連結することはできません –

+0

2番目(およびoptio 'Array.prototype.reduce'のパラメータは初期値です。あなたのケースでは、初期値として '0'を渡しているので、関数が最初に実行されたときに' number'に 'concat'メソッドがないので明らかに失敗する' prev.concat'を呼び出そうとします。 – haim770

+0

reduceの2番目のバージョンでは何を達成しようとしますか? – Harald

答えて

1

i not have completely clear how reduce works yet

にそれはこのように動作します:

Array.prototype.reduce = function(callback, startValue){ 
    var initialized = arguments.length > 1, 
     accumulatedValue = startValue; 

    for(var i=0; i<this.length; ++i){ 
     if(i in this){ 
      if(initialized){ 
       accumulatedValue = callback(accumulatedValue, this[i], i, this); 
      }else{ 
       initialized = true; 
       accumulatedValue = this[i]; 
      } 
     } 
    } 

    if(!initialized) 
     throw new TypeError("reduce of empty array with no initial value"); 
    return accumulatedValue; 
} 

あなたの失敗例はかなりこのん:

var array = [[1,2,3],[4,5,6],[7,8,9]]; 

var tmp = 0; 
//and that's where it fails. 
//because `tmp` is 0 and 0 has no `concat` method 
tmp = tmp.concat(array[0]); 
tmp = tmp.concat(array[1]); 
tmp = tmp.concat(array[2]); 

var new_array = tmp; 

[ 0 ]

関連する問題