如何在 javascript 中递归使用 reduce() 方法? [复制]

Posted

技术标签:

【中文标题】如何在 javascript 中递归使用 reduce() 方法? [复制]【英文标题】:How do I recursively use the reduce() method in javascript? [duplicate] 【发布时间】:2016-04-01 04:04:51 【问题描述】:

问题是使用reduce()对数组数组进行操作,返回一个没有子数组的齐次数组。 例如 - [1,2,[3,[4,5]]] 将返回 [1,2,3,4,5]。

这是有效的代码,考虑到子数组本身不是另一个数组数组-

var a = [3,[4,[5,[6,7]]]];
var b = 8;
var c = [9,10];
var x = []

var arr = [1,2,a,b,c];
arr = [1,2,3,4,c];

console.log(arr.reduce(function oneArray(a,b)
    
        return a.concat(b); 
    ,x))

请注意,我更改了我的 arr 数组,因为代码不适用于第一个 arr 数组,即 [1,2,a,b,c]。 对于 arr [1,2,3,4,c],返回的对象是 [1,2,3,4,9,10]

这是我尝试使它适用于第一个arr-

function oneArray(a,b)
    
        if (typeof b == "object")
            b = b.reduce(oneArray(x,y),[]);
        return a.concat(b); 
    

    console.log(arr.reduce(oneArray(a,b),x));

这给了我错误

Uncaught TypeError: [object Array] is not a function(anonymous function) @ Flattening.html:27

它将我的函数 oneArray 解释为数组而不是函数

我理解问题来自这样一个事实,即 reduce 可以(我认为)只能与定义为参数的函数一起使用。 有没有人有一个解决方案,让我得到 [1,2,3,4,5,6,78,9,10] 作为我的结果,解决 reduce() 的限制,除非我错过了什么?

【问题讨论】:

我只看了标题,但在标题中你问错了问题。你有情况A,你想达到情况B。解释你想要什么;不是你认为你想要的。如果你知道怎么做,你就不用问了。 若要提供function 作为参数,请仅通过名称传递它——arr.reduce(onArray, x)。在名称后包含括号首先调用函数并将其return 值提供给arr.reduce() 为什么要复制?这里需要递归,在另一个问题中只是 2 级数组。 【参考方案1】:

通过对数组的测试和对 reduce 函数的递归调用来减少。

编辑:感谢 Jonathan Lonowski 的提示。

function flat(r, a) 
    if (Array.isArray(a)) 
        return a.reduce(flat, r);
    
    r.push(a);
    return r;


var array = [3, [4, [5, [6, 7]]]];
document.write('<pre>' + JSON.stringify(array.reduce(flat, []), 0, 4) + '</pre>');

【讨论】:

注意:减少嵌入式数组的行可以缩短为return a.reduce(flat, r);。它将.push() 指向整个调用堆栈中的同一个数组,而不是创建一个新数组来连接。 @JonathanLonowski,谢谢,请查看编辑。

以上是关于如何在 javascript 中递归使用 reduce() 方法? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

递归打印字符串的所有排列(Javascript)

javascript 在 Javascript 中进入无限循环和递归调用时如何调试它?

javascript --- 递归的简单理解

如何打破递归函数内的 for 循环并在 Javascript 中返回?

Node.js / Javascript 多重递归承诺在视图中返回

如何递归搜索对象树并使用 JavaScript/Prototype 1.7 基于键/值返回匹配的对象