简单javascript递归函数返回的值比实际存在的值多?

简单javascript递归函数返回的值比实际存在的值多?,javascript,function,recursion,Javascript,Function,Recursion,我正在练习递归,并编写了以下函数: var bigArray = ['a', ['b', ['c', ['d', {a:'e'}]]]]; var results = []; function bagger293(bigArray){ for (var item in bigArray){ if (Array.isArray(bigArray[item])){ bagger293(bigArray[item]); } else if (typeof b

我正在练习递归,并编写了以下函数:

var bigArray = ['a', ['b', ['c', ['d', {a:'e'}]]]];
var results = [];

function bagger293(bigArray){
  for (var item in bigArray){
    if (Array.isArray(bigArray[item])){
      bagger293(bigArray[item]);
    }
     else if (typeof bigArray[item] === 'object'){
      bagger293(bigArray[item]);
    }else{
      results.push(bigArray[item]);
    }
  }
}

bagger293(bigArray);
console.log(results);
我只想让函数将任何单个值推送到数组中,并在它是对象还是数组时进行更深入的搜索。奇怪的是,我的函数返回如下结果:

['a',
“b”,
"c",,
“d”,
"e",,
“d”,
"e",,
"c",,
“d”,
"e",,
“d”,
"e",,
“b”,
"c",,
“d”,
"e",,
“d”,
"e",,
"c",,
“d”,
"e",,
“d”,
“e”]

我想这是因为我的方式指定

bigArray[item]
但不知道确切原因

预期结果:


['a',b',c',d',e']

您缺少一个else。因为数组也是一个对象,所以代码会启动递归两次

这是有效的:

function bagger293(bigArray){
  for (var item in bigArray){
    if (Array.isArray(bigArray[item])){
      bagger293(bigArray[item]);
    }else if (typeof bigArray[item] === 'object'){
      bagger293(bigArray[item]);
    }else{
      results.push(bigArray[item]);
    }
  }
}

您缺少一个
。一旦你发现了一个阵列,停止尝试用它做其他事情

var bigArray=['a',['b',['c',['d',{a:'e'}]];
var结果=[];
函数bagger293(bigArray){
for(bigArray中的变量项){
if(Array.isArray(bigArray[item])){
bagger293(大数组[项目]);
} 

else if(typeof bigArray[item]=='object'){/所有数组都是对象。无需同时检查
Array.isArray
typeof=='object'

var bigArray=['a',['b',['c',['d',{a:'e'}]];
var结果=[];
(功能bagger293(bigArray){
for(bigArray中的变量项)
if(bigArray[项目]=='object'的类型)
bagger293(大数组[项目]);
其他的
结果:推送(bigArray[项目]);
})(大数组);

console.log(results);
我甚至不认为这在递归上下文中有什么好处。我稍微快了一点。:o