【问题标题】:How do I recursively use the reduce() method in javascript? [duplicate]如何在 javascript 中递归使用 reduce() 方法? [复制]
【发布时间】: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 级数组。

标签: javascript arrays reduce


【解决方案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,谢谢,请查看编辑。
猜你喜欢
  • 2010-09-26
  • 2017-07-29
  • 1970-01-01
  • 1970-01-01
  • 2016-04-10
  • 2012-05-04
  • 2014-12-19
  • 2014-02-12
  • 2014-10-25
相关资源
最近更新 更多