我在玩数组,只是学习javascript基础,每当我将传递的参数更改为console.log(arr[i][j][k])给我未定义的数字时,我就得到了一个基本函数,但是如果它是字符串,它将记录该数字。

function array(arr) {
    for(var i=0;i < arr.length;i++){
      for(var j=0; j < arr[i].length; j++){
            for(var k=0; k < arr[i][j].length; k++){
              console.log(arr[i][j][k])
            }
      }
    }
}

array(['1','2',['3','4'],['5','6','7']]); // change to a number and will give undefined.

最佳答案

问题是因为您正在循环中调用.length。数字没有.length方法,因此它返回未定义的。但是,字符串确实具有该方法。

作为可行方法的示例,您可以检查数组中的索引是否为数字,然后检查console.log该数字和continue(数组中的下一个索引)。



function array(arr) {
  for(var i=0;i < arr.length;i++){
    for(var j=0; j < arr[i].length; j++){
      if (typeof arr[i][j] === 'number') {
        console.log(arr[i][j]);
        continue;
      }

      for(var k=0; k < arr[i][j].length; k++){
        console.log(arr[i][j][k])
      }
    }
  }
}

array(['1','2',['3','4'],['5','6', 7]]);





您将需要在每个循环中执行此检查,以计算数组中任何位置的数字。

以@chazsolo的答案为基础,这是非ES6做相同事情的方式,以防万一将ES6语法混入混乱



var allItems = function (array) {
  var i = 0;
  // Loop through all items
  for (i; i < array.length; ++i) {
    // If this item is an array
    // You could also use typeof or Array.isArray as below
    if (toString.call(array[i]) === '[object Array]') {
      allItems(array[i]); // run this function again with this array
      continue; // move to next item
    }

    console.log(array[i]);
  }
}

allItems([1, 2, [3, 4], [5, 6, 7]]);

allItems(['1', '2', ['3', '4'], ['5', '6', '7']]);

allItems(['a', ['b', ['c', ['d', ['e', ['f', ['g']]]]]]]);





首先,我们遍历数组中的所有项目。我们检查项目本身是否为数组(在这里我称为toString,如果它是数组则返回[object Array])。如果它是一个数组,那么我们对该数组运行相同的函数(递归),然后跳到下一项,因为我们不需要对此进行任何其他操作。

如果它不是数组,那么我们可以控制台对其进行记录(在这里我们假设它是一个数字或字符串,请注意是否有对象混入其中)。

07-24 09:52
查看更多