如何将循环中的局部数组连接到循环外的局部数组

How to concat a local array from a loop into a local array outside loop?

本文关键字:局部 数组 循环 连接      更新时间:2023-09-26

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

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, []));

您可以使用Array.prototype.reduce来实现此结果。

function x(r,a) {
    if (Array.isArray(a)) {
        return a.reduce(x, r);
    }
    if (a && typeof a === 'object') {
        return Object.keys(a).map(function (b) { return a[b]; }).reduce(x, r);
    }
    r.push(a);
    return r;
}
var bigArray = ['a', ['howdy', 'partner'], ['b', ['c', ['d', { a: 'e', b: ['yes', 'no', { apple: 'orange' }] }]]]],
    result = bigArray.reduce(x, []);
document.write(JSON.stringify(result));

也可以将结果传递给函数。

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;
}

将results声明为bagger293的成员,只有当bagger293为空时才初始化。

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"、"是"、"否"、"橙色"