Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将本地数组从一个循环连接到一个循环外部的本地数组?_Javascript_Function_Loops_Recursion - Fatal编程技术网

Javascript 如何将本地数组从一个循环连接到一个循环外部的本地数组?

Javascript 如何将本地数组从一个循环连接到一个循环外部的本地数组?,javascript,function,loops,recursion,Javascript,Function,Loops,Recursion,我有一个基本的递归函数,它应该将在每个数组/对象中找到的每个值推送到结果数组中: 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 big

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

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”、“你好”、“合作伙伴”、“b”、“c”、“d”、“e”、“是”、“否”、“橙色”]

但由于
var结果=[]
位于函数内部,每次递归发生时,调用函数时,结果数组都会更改,而不是添加到每个循环中。我知道我需要喝一杯,但我不知道怎么喝。我尝试了
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, []));

您也可以随时将结果传递到函数中

function bagger293(bigArray, results) {
    // If results is passed, it will stay with that data. If it is not passed, it will be a new array.
    results = results || []; 

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

      return results;
}

将结果声明为bagger293的成员,并仅在其为void时对其进行初始化

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

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

console.log(bagger293(bigArray));

输出:[“a”、“你好”、“搭档”、“b”、“c”、“d”、“e”、“是”、“否”、“橙色”]

您可以使用
数组。原型。减少
以获得结果

函数x(r,a){
if(数组isArray(a)){
返回a.reduce(x,r);
}
if(a&&typeof a==='object'){
返回Object.keys(a).map(函数(b){returna[b];}).reduce(x,r);
}
r、 推(a);
返回r;
}
var bigArray=['a',['howdy','partner'],['b',['c',['d',{a'e',b:['yes','no',{apple:'orange'}]],
结果=bigArray.reduce(x,[]);

document.write(JSON.stringify(result));
您可以看到bagger293递归调用results变量的结果。这实际上是有意义的,但会为(bigArray中的var项)生成
{RangeError:超过了最大调用堆栈大小
@melpomene您应该对此作出回答。:)