Javascript 返回的函数具有来自父函数的未定义结果数组
我正在尝试使用ES5制作一个简单的函数来深度展平阵列。我下面的方法可以工作,但似乎不太理想,因为Javascript 返回的函数具有来自父函数的未定义结果数组,javascript,arrays,recursion,Javascript,Arrays,Recursion,我正在尝试使用ES5制作一个简单的函数来深度展平阵列。我下面的方法可以工作,但似乎不太理想,因为resresults数组被保留在展平函数之外 var-arr=[1,2,3,4,5,6,7,8,9,10,11]] ,res=[]; 函数展平(项目){ if(阵列isArray(项目)){ item.forEach(el=>{ 返回平坦(el,res); }); }否则{ 物品推送; } } 展平(arr); 控制台日志(res)//[1、2、3、4、5、6、7、8、9、10、11]将递归函数嵌套
res
results数组被保留在展平函数之外
var-arr=[1,2,3,4,5,6,7,8,9,10,11]]
,res=[];
函数展平(项目){
if(阵列isArray(项目)){
item.forEach(el=>{
返回平坦(el,res);
});
}否则{
物品推送;
}
}
展平(arr);
控制台日志(res)//[1、2、3、4、5、6、7、8、9、10、11]
将递归函数嵌套在主函数中。然后您可以在主函数中使用res
变量
var arr=[1,2,3],
[4, [5, [6, 7, 8, 9, 10, 11]]]
];
函数展平(项目){
var-res=[];
功能展平记录(项目){
if(阵列isArray(项目)){
item.forEach(el=>{
展平(el);
});
}否则{
物品推送;
}
}
展平记录(项目);
返回res;
}
var res=扁平化(arr);
控制台日志(res)//[1、2、3、4、5、6、7、8、9、10、11]
将递归函数嵌套在主函数中。然后您可以在主函数中使用res
变量
var arr=[1,2,3],
[4, [5, [6, 7, 8, 9, 10, 11]]]
];
函数展平(项目){
var-res=[];
功能展平记录(项目){
if(阵列isArray(项目)){
item.forEach(el=>{
展平(el);
});
}否则{
物品推送;
}
}
展平记录(项目);
返回res;
}
var res=扁平化(arr);
控制台日志(res)//[1,2,3,4,5,6,7,8,9,10,11]
这里是一种使用数组.prototype.reduce的不同方法
var-arr=[1,2,3,4,5,6,7,8,9,10,11]];
var res=arr.reduce(函数展平(a,b){
if(Array.isArray(a)和&Array.isArray(b)){
返回b.reduce(展平,a)
}否则{
返回a.concat(b)
}
}, [])
console.log(res)
。作为控制台包装器{
排名:0;
最大高度:100%!重要;
}
这里有一种不同的方法,使用Array.prototype.reduce
var-arr=[1,2,3,4,5,6,7,8,9,10,11]];
var res=arr.reduce(函数展平(a,b){
if(Array.isArray(a)和&Array.isArray(b)){
返回b.reduce(展平,a)
}否则{
返回a.concat(b)
}
}, [])
console.log(res)
。作为控制台包装器{
排名:0;
最大高度:100%!重要;
}
在我看来,迭代方法要比递归好得多
// Deep copy all arguments into a new, single-level array.
const flatten = (...queue) => {
const result = [];
while (queue.length > 0) {
const item = queue.shift();
if (Array.isArray(item)) {
let i = item.length;
// If the array is non-empty, add its children to the beginning
// of the queue to keep their order intact.
while (i--) {
queue.unshift(item[i]);
}
}
else {
result.push(item);
}
}
return result;
};
在我看来,迭代方法要比递归好得多
// Deep copy all arguments into a new, single-level array.
const flatten = (...queue) => {
const result = [];
while (queue.length > 0) {
const item = queue.shift();
if (Array.isArray(item)) {
let i = item.length;
// If the array is non-empty, add its children to the beginning
// of the queue to keep their order intact.
while (i--) {
queue.unshift(item[i]);
}
}
else {
result.push(item);
}
}
return result;
};
@Barmar Updated问题是每次进行递归调用时,您都将res
设置为[]
。@Barmar是的,我曾尝试过类似于res=res | |[]
但仍然有一个引用错误。@Barmar更新了问题是每次进行递归调用时,您都将res
设置为[]
。@Barmar是的,我曾尝试过类似于res=res | |[]代码>但仍有一个引用错误。