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
并遇到一些特定的障碍?