【问题标题】:Javascript Nested Array Return Even NumbersJavascript嵌套数组返回偶数
【发布时间】:2017-06-17 20:19:21
【问题描述】:

我正在尝试编写一个仅打印嵌套数组中的偶数的函数。这是我的尝试,它不断返回“未定义”。

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

【问题讨论】:

  • 首先j&lt;nestedArr[i].length - 添加.length。其次 - 将您的 if 放在内部循环中,否则没有任何意义。

标签: javascript arrays nested-loops


【解决方案1】:

如果项目是数组,您可以使用递归方法。您需要在 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]]]]]);

回调解决方案

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

【讨论】:

    【解决方案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)
          }
        }
      }

    【讨论】:

      【解决方案3】:

      您可以使用接受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));

      【讨论】:

      • 谢谢!这真的很有趣,因为它会打印出一个数组。如果需要打印每个值,我想知道如何处理它?
      【解决方案4】:

      你可以使用 reduce 来快速做一些事情。

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

      如果你想要一个单行,你可以使用带过滤器的 ReduceRight

      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)

      【讨论】:

      • 为什么在第一种情况下关闭(无所事事)?
      • @NinaScholz 我的错 :) 已修复
      • @NinaScholz 如果您发现任何可以修复或改进的内容,请告诉我。您的所有建议都是金
      猜你喜欢
      • 2018-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-23
      • 1970-01-01
      相关资源
      最近更新 更多