如何将循环中的局部数组连接到循环外的局部数组
How to concat a local array from a loop into a local array outside loop?
我有一个基本的递归函数,它应该将每个数组/对象中的每个值压入结果数组:
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"、"是"、"否"、"橙色"
相关文章:
- 如何在映射数组中添加换行符
- javascript结合了数组和字典
- 需要帮助设置json数组
- 不能从angular2中的子组件指定父组件中的数组
- 使用JS将数组转换为json对象
- 数组在递归方法中设置为null
- knockoutjs可观察数组
- Javascript-如何读取json文件中的列并将其保存在Javascript数组中
- 将数组从PHP传递到Javascript
- JavaScript数组排序(函数)用于对表行进行排序,而不是排序
- 在函数中添加数组元素的数值
- 无法通过数组映射绑定
- javascript中的数组出错
- 如何使用 node.js 比较两个 json 数组
- Javascript(Angular)从一个对象数组到第二个数组查找值
- 根据id将json数组组合为一个json数组
- 如何通过数组更新角度子范围
- 有没有一种方法可以添加相同的项目val=“0”;4〃;到JavaScript中数组的每个对象
- 局部数组变量不是数组
- 如何将循环中的局部数组连接到循环外的局部数组