如何在 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 中进入无限循环和递归调用时如何调试它?
如何打破递归函数内的 for 循环并在 Javascript 中返回?