Javascript 返回的函数具有来自父函数的未定义结果数组

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]将递归函数嵌套

我正在尝试使用ES5制作一个简单的函数来深度展平阵列。我下面的方法可以工作,但似乎不太理想,因为
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 | |[]但仍有一个引用错误。