我有一个基本的递归函数,应该将在每个数组/对象中找到的每个值推入结果数组:

var bigArray = ['a', ['howdy', 'partner'], ['b', ['c', ['d', {a:'e', b:['yes', 'no', {apple: 'orange'}]}]]]];

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

console.log(bagger293(bigArray));


期望:[ 'a', 'howdy', 'partner', 'b', 'c', 'd', 'e', 'yes', 'no', 'orange' ]

但是由于var results = [];在函数内部,因此每次递归调用函数时,结果数组都会更改,而不是添加到每个循环中。我知道我需要配合,但是我不确定该怎么做。我试过results.concat(results.push(bigArray[item]);,但只返回['a']

如果将var results = [];移到全局范围,则不需要concat即可完美运行,但我想在本地范围内实现。有任何想法吗?

最佳答案

最简单的方法是将结果数组与函数一起传递:

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

console.log(bagger293(bigArray, []));

10-08 06:17