给定一个随机数组,数组可能包含数组(也就是说数组元素可能为数组)。要求用js实现一个函数,返回该数组中所有元素。例如,例如:数组[2,3,[4,6,[1,8]],12,10],返回结果为:[2,3,4,6,1,8,12,10]
错误代码:
function getArray(arr)
{
var arrs = [];
for(i=0;i<arr.length;i++)
{
if(typeof arr[i] == "number")
{
arrs.push(arr[i])
}
else{
var temp = getArray(arr[i]);
arrs.concat(temp);
}
}
return arrs;
}
正确代码:
var arrs = [];
function getArray(arr)
{
for(i=0;i<arr.length;i++)
{
console.log(arrs);
if(typeof arr[i] == "number")
{
arrs.push(arr[i])
}
else{
getArray(arr[i]);
}
}
}
输出arrs为正确答案
请问第一个代码为什么是错的???
.concat
是返回合并数组,不是直接在原数组上修改的,你这么改一下应该就 OK 了:
arrs = arrs.concat(temp);
另外,你的 for 循环用的 i
没有用 var
定义,所以是全局变量,在递归调用的时候 i
的值会随着递归改变,所以会有数据无法进入到循环被 push 的情况。
另外,最好判断 Array.isArray(arr[i])
而不是判断它是否是数字。
根据以上意见你的代码改成如下是正常的:
function getArray(arr) {
var arrs = [];
for(var i=0,l=arr.length;i<l;i++) {
if(!Array.isArray(arr[i])) arrs.push(arr[i]);
else arrs = arrs.concat( getArray(arr[i]) );
}
return arrs;
}
第一个程序大部是正确的,除了 concat
那里。concat
不改变原数据,只是返回一个新的结果数组,作个实验:
javascript
var a = [1,2,3] var b = a.concat([4,5]) console.log(a, b) // [1, 2, 3] [1, 2, 3, 4, 5]