2017-06-17 11 views
5

ネストされた配列から偶数だけを出力する関数を記述しようとしています。ここに私の試みがあり、それは "未定義"を返し続けます。Javascriptネストされた配列偶数を返す

function printEvents(){ 

var nestedArr = [[1,2,3],[4,5,6],[7,8],[9,10,11,12]]; 

    for (var i = 0; i<nestedArr.length; i++) { 
    for (var j = 0; j<nestedArr[i]; j++) { 
     var evenNumbers = nestedArr[i][j] 
    } 
    } 

    if (evenNumbers % 2 == 0) { 
    console.log(evenNumbers) 
    } 

} 

printEvents(); 
+0

でReduceRightを使用することができます'--length'を追加します。そして2番目に、内側ループの内側に 'if 'を入れます。そうでなければ意味をなさない。 – wostex

答えて

2

ちょっとした問題があります。ネストされた配列の長さをチェックする必要がありますし、配列内の数字が一致するかどうかをチェックするコードを移動する必要があります。

var nestedArr = [[1,2,3],[4,5,6],[7,8],[9,10,11,12]]; 
 

 
    for (var i = 0; i<nestedArr.length; i++) { 
 
    for (var j = 0; j<nestedArr[i].length; j++) { 
 
     var evenNumbers = nestedArr[i][j] 
 
     if (evenNumbers % 2 == 0) { 
 
     console.log(evenNumbers) 
 
     } 
 
    } 
 
    }

1

あなたはcallback方法を受け入れるfilter方法を使用して、より簡単にこれを行うことができます。

var nestedArr = [[1,2,3],[4,5,6],[7,8],[9,10,11,12]]; 
 
var mergedArray=[].concat.apply([], nestedArr); 
 
console.log(mergedArray.filter(a=>a%2==0));

+0

ありがとう!これは配列を出力するので面白いです。それぞれの価値をプリントアウトする必要がある場合、私はそれにアプローチする方法が不思議でしたか? – huisleona

3

項目が配列である場合は、再帰的なアプローチを使用することができます。ループの内部で均一性をテストする必要があります。

function printEvents(array) { 
 
    var i; 
 
    for (i = 0; i < array.length; i++) { 
 
     if (Array.isArray(array[i])) { 
 
      printEvents(array[i]); 
 
      continue; 
 
     } 
 
     if (array[i] % 2 == 0) { 
 
      console.log(array[i]); 
 
     } 
 
    } 
 
} 
 

 
printEvents([[1, 2, 3], [4, 5, 6], [7, 8], [9, 10, 11, 12], [[[13, [14]]]]]);

コールバックあなたが迅速な何かごとに減らす使用することができます

function getEven(a) { 
 
    if (Array.isArray(a)) { 
 
     a.forEach(getEven); 
 
     return; 
 
    } 
 
    if (a % 2 == 0) { 
 
     console.log(a); 
 
    } 
 
} 
 

 
getEven([[1, 2, 3], [4, 5, 6], [7, 8], [9, 10, 11, 12], [[[13, [14]]]]]);

0

とソリューション。

var nestedArr = [ [1, 2, 3],[4, 5, 6],[7, 8],[9, 10, 11, 12]]; 
 

 
var sift = nestedArr.reduce(function(r,o) { 
 
    o.every(i => i % 2 === 0 ? r.push(i) : true) 
 
    return r; 
 
}, []); 
 

 
console.log(sift);

あなたはワンライナーをしたい場合は、すべての `J

var nestedArr = [[1, 2, 3],[4, 5, 6],[7, 8],[9, 10, 11, 12]]; 
 

 
var sift = nestedArr.reduceRight((p, b) => p.concat(b).filter(x => x % 2 === 0), []); 
 

 
console.log(sift)

+0

最初のケースでクロージャー(何もしません)? –

+0

@NinaScholz私の悪い:)固定 – Rick

+0

@ NinaScholzあなたが何かを修正したり、改善することができたら、何かを見たら教えてください。あなたからのアドバイスはすべて金です – Rick