2017-06-17 17 views
5

Tôi đang cố gắng viết một hàm chỉ in các số chẵn từ một mảng lồng nhau. Đây là nỗ lực của tôi và nó tiếp tục trở về "không xác định".Mảng lồng nhau Javascript Trả về số chẵn

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

Trước hết 'j wostex

Trả lời

2

Bạn chỉ gặp một vài vấn đề. Bạn cần phải kiểm tra độ dài của các mảng lồng nhau của bạn và bạn cần phải di chuyển mã của bạn để kiểm tra xem một số là ngay cả hay không bên trong mảng.

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

Bạn có thể làm dễ dàng hơn phương pháp này sử dụng filter mà chấp nhận một phương pháp callback.

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

Cảm ơn! Điều này thực sự thú vị vì nó in ra một mảng. Tôi đã tự hỏi làm thế nào để tiếp cận nó nếu nó đòi hỏi phải in ra mỗi giá trị? – huisleona

3

Bạn có thể sử dụng một cách tiếp cận đệ quy, nếu mục là một mảng. Bạn cần phải di chuyển thử nghiệm cho sự đồng đều bên trong vòng lặp for.

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]]]]]);
Giải pháp

với một callback

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

Bạn có thể sử dụng giảm với mỗi một cái gì đó nhanh chóng.

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);

Nếu bạn muốn có một one-liner bạn có thể sử dụng ReduceRight với Lọc

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

tại sao việc đóng cửa (không có gì) trong trường hợp đầu tiên? –

+0

@NinaScholz xấu của tôi :) đã sửa – Rick

+0

@NinaScholz Vui lòng cho tôi biết nếu bạn thấy bất kỳ điều gì có thể được khắc phục hoặc cải thiện, bất cứ điều gì. Tất cả lời khuyên từ bạn là vàng – Rick

Các vấn đề liên quan