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您应该对此作出回答。:)