2016-12-28 6 views
0

私はJSには新しく、配列を平坦化するタスクがあります。私が持っているものは[1,2,[3,4]]です。それを[1,2,3,4]に変えなければなりません。次の方法を使用します。JSの配列 - それはオブジェクトだと言っています

function flatten(arr){ 
    return arr.reduce(function(a, b) { 
     return a.concat(b); 
    });  
} 

しかし、concatは機能ではありません。

Array.isArray(arr); //returns true 

は、誰かがここで何をすべきかを教えてもらえます:)

+3

ヒント: 'arr'が配列であるかどうかをテストしていますが、' a'でconcatを呼び出しています。 'a'が配列であるかどうか調べてみませんか? :) – apsillers

答えて

3

あなたarr値が[1,2,[3,4]]です:

function flatten(arr) { 
 
    return arr.reduce(function(a, b) { 
 
    return a.concat(b); 
 
    }, []); 
 
} 
 

 
console.log(flatten([1, 2, [3, 4]]))

+0

最初のステップで '[] + 1'となり、' [1] 'となるでしょうか? –

1

はあなただけreduceに初期値として、コールバック関数の後に配列[]を提供する必要があり、そうでない場合、その値は、あなたの配列の最初の要素になります。だからあなたのコードの最初の反復の削減でこれをしようとしているa.concat(b)ここでaは1であり、bは2であり、エラーをスローします。

var array = [].concat.apply([], [1,2,[3,4]]); 
 
console.log(array);

1

あなたはこのソリューションを使用することができます。配列番号は1、数字は2、配列は[3,4]です。 reduceコールバックに

最初の2つの引数は(コールバックの前の呼び出しの戻り値)アキュムレータ

  • から順に取り込ま

    1. ありますアレイ。

    ことがreduceコールバックへの最初の呼び出しを意味し、引数として最初2つのエントリを(すなわち、配列の最初の要素は次のように使用されて受け入れるようにするには、あなたのコードの最初のアキュムレータを提供していません。アキュムレータ)。 aの初期値は数値であり、配列ではないため、concatは関数ではありません。 arrが配列であるかどうかを確認するためにテストしましたが、aが配列であるかどうかをテストしませんでした。

    ここで透明な溶液がアキュムレータとして使用する初期値を供給することである。

    function flatten(arr){ 
        return arr.reduce(function(a, b) { 
         return a.concat(b); 
        }, []);  
    } 
    

    これは([]で)空の配列を作成し、最初の呼び出しのためのa値として供給する。 reduceコールバック。

  • 0

    アルファが配列であることを確認してください。しかし、concatと呼んでください。この 試験:アレイ約

    if(a instanceof Array)
    1

    ドキュメントは

    javascript配列オブジェクトがアレイの構築に使用されるグローバルオブジェクトであると言います。高レベルのリストのようなオブジェクトです。あなたの例では

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array

    あなたは空の配列からBすることができ、初期値を提供する必要があります削減のために。

    var flattened = [1,2,[3,4]].reduce(function(a, b) { 
     
        return a.concat(b); 
     
    }, []); 
     
    
     
    console.log(flattened)

    0

    あなたはSpread syntaxと組み合わせるArray.prototype.concat()使用することができます。

    var flattened = [].concat.call([], ...[1, 2, [3, 4]]); 
     
    
     
    console.log(flattened);

    1

    concatを別のアレイに参加する値の配列を期待しています。これが失敗する原因は、配列が完全な行列ではないためです。

    function flattenArr(arr) { 
     
        const newArr = [] 
     
    
     
        function recursiveFlat(a) { 
     
    
     
         if(!Array.isArray(a)) { 
     
          newArr.push(a); 
     
         } 
     
    
     
         else { 
     
    
     
          for (let i = 0; i < a.length; i++) { 
     
           if(Array.isArray(a[i])) { 
     
            recursiveFlat(a[i]); 
     
           } 
     
    
     
           else { 
     
            newArr.push(a[i]); 
     
           } 
     
          } 
     
         } 
     
        } 
     
    
     
        arr.forEach(item => recursiveFlat(item)); 
     
        return newArr; 
     
    
     
    } 
     
    
     
    arr = [1, 2, [3, 4]] 
     
    
     
    console.log(flattenArr(arr))

    あなたのアレイの問題は、その特定の配列のための単一のハードコード化されたソリューションを作成するのが賢明ではないであろうということで、あなたはおそらくのような再帰関数を作成する必要があります

    そのようにすると、形状に関係なく配列が常に平坦化されます。

    関連する問題