Javascript 使用map/reduce递归计算状态?

Javascript 使用map/reduce递归计算状态?,javascript,typescript,Javascript,Typescript,比如说,我有一个对象数组 let objs: foo[]; 不可变状态对象 let state: State; 和一个函数 transform: (state: State, obj: foo) => State; 因此transform使用当前obj中的信息,从上一个状态计算新的状态;如果你在想‘我觉得这听起来像雷杜’,你可能是对的 是否有一种方法可以对数组中的每个对象递归调用transform,使得每个计算的状态都是下次调用transform时使用map和reduce的输入参数?

比如说,我有一个对象数组

let objs: foo[];
不可变状态对象

let state: State;
和一个函数

transform: (state: State, obj: foo) => State;
因此
transform
使用当前
obj
中的信息,从上一个
状态计算新的
状态
;如果你在想‘我觉得这听起来像雷杜’,你可能是对的

是否有一种方法可以对数组中的每个对象递归调用
transform
,使得每个计算的
状态
都是下次调用
transform
时使用
map
reduce
的输入参数?我只对最后的
状态感兴趣

我试过类似的东西

let finalState = objs.reduce((prev: State, curr: foo) => transform(prev, curr), state)

但是由于
reduce
要求
prev
curr
类型为
foo
(数组类型),这显然不起作用。

您可以使用
array.prototype.reduce>提供的当前
索引

return objs.reduce((prev, next, index) => transform(prev, objs[index]), state);
但是这样你就有点滥用了
reduce
功能。Imo这应该也可以通过定期的
forEach
声明来完成:

function getFinalState(state: State, objs: Obj[]) : State {
    objs.forEach(x => state = transform(state, x));

    return state;
}

查看此工作示例

您是否尝试过
objs.foreach(x=>this.transform(state,x))
?它听起来确实像是您正在寻找的
reduce
,除了递归部分。你是说你的对象本身有一些属性,是一个数组(?)你想递归地减少?你要求递归的
reduce
实现?我可能遗漏了一些东西,但我不明白为什么递归会涉及到
state[I+1]=transform(state[I],objs[I])
,其中每个
状态都是不可变的。给定一个
objs:foo[n]
数组,我需要
state[n]
。这与聚合东西非常相似,这就是为什么我的直觉是,使用
reduce
,这可以工作。是的。从您说话的方式来看,您确实应该熟悉
reduce
的工作原理以及如何应用它。你到底有什么顾虑/问题?您是否尝试过应用
reduce
并遇到一些特定的障碍?