如何在javascript中打印偶数个子数组

时间:2017-10-12 00:20:53

标签: javascript arrays

https://www.google.com/recaptcha/api.js
我这样做对吗?还是我错过了标记? 你怎么解决这个问题?

6 个答案:

答案 0 :(得分:3)

以下是如何执行此操作的示例。

function printEvens(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]);
        }
    }
}

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

答案 1 :(得分:1)

我会使用reduce和filter来实现你需要的东西:

let yourArray = [[1,2,3],[4,5,6],[7,8],[9,10,11,12]];
let evenNumbers = yourArray.reduce((prevVal,currVal)=>{
  let value = currVal.filter(val => val%2===0);
  prevVal.push(...value);
  return prevVal;
}, [])

答案 2 :(得分:0)

像这样:

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

for(var key1 in nestedArr){
    var item_nestedArr=nestedArr[key1];
    for(var key2 in item_nestedArr){
       if(item_nestedArr[key2] % 2 == 0){            
            console.log(item_nestedArr[key2]);
       }
    }
}

答案 3 :(得分:0)

<强>问题

问题在于内循环。你获得整个数组的string表示,然后split并获得另一个数组:

var arr = nestedArr.toString().split(','); 

它们已经是数组,不需要拆分。您可以直接访问所需的位置。拆分后,您将此数组作为指定2个索引的2D数组访问:

console.log(arr[i][j]);

如果你只是split它,它只有1维,因为split总是返回1D数组。

自己查看split结果:

&#13;
&#13;
var nestedArr = [[1,2,3],[4,5,6],[7,8],[9,10,11,12]];
console.log(nestedArr.toString().split(','));
&#13;
&#13;
&#13;

同样测试i % 2 == 0只会显示主阵列的位置/索引,而不是子阵列。

<强>解决方案

只有ifconsole.log需要调整才能发挥作用:

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

function printEvens() {

    for(var i = 0; i < nestedArr.length; i++) {
        for(var j = 0; j < nestedArr[i].length;j++){
            //no splitting just accessing directly the correct indexes
            if(nestedArr[i][j] % 2 == 0){ 
                console.log(nestedArr[i][j]); //nestedArr instead of arr
            }
        }
    }
}
printEvens();
&#13;
&#13;
&#13;

一个更有趣的解决方案是使用带有forEach的双Arrow Functions,这使得它成为一个班轮:

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

nestedArr.forEach(x => x.forEach(y => { if (y % 2 == 0) console.log(y); }));
&#13;
&#13;
&#13;

免责声明:最后提出的解决方案使用ES6语法,如文档链接

所示

答案 4 :(得分:0)

虽然问题有点含糊不清。 @Barmar是对的。您可以简单地将迭代器增加2。

function printEvens() {
    for(var i = 0; i < nestedArr.length; i += 2) {
        for(var j = 0; j < nestedArr[i].length; j++){
            console.log(nestedArr[i].toString(););
        }
    }
}

答案 5 :(得分:0)

这里需要一个展平算法。如果您可以使用开源库,lodash.flattenDeep可以提供帮助。否则你可以这样做:

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

function flatten(ary) {
  return ary.reduce(
    (flattened, e) => 
      e.constructor === Array ?
        flattened.concat(flatten(e)) :
        flattened.concat([e]),
    []
  );
}

console.log(flatten(nestedArr).filter(n => n % 2 === 0));