我在玩数组,只是学习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]
)。如果它是一个数组,那么我们对该数组运行相同的函数(递归),然后跳到下一项,因为我们不需要对此进行任何其他操作。如果它不是数组,那么我们可以控制台对其进行记录(在这里我们假设它是一个数字或字符串,请注意是否有对象混入其中)。