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

时间:2016-12-05 08:17:05

标签: javascript typescript

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

let objs: foo[];

不可变状态对象

let state: State;

和一个功能

transform: (state: State, obj: foo) => State;

因此transform使用当前State的信息计算前一个obj的新transform;如果你认为'对我来说听起来像Redux',你可能是对的。

有没有办法以递归方式为数组中的每个对象调用state,每个计算的transform是使用{{1}进行map的下一次调用的输入参数和reduce?我只对最后的state感兴趣。

我试过像

这样的东西
let finalState = objs.reduce((prev: State, curr: foo) => transform(prev, curr), state)

但由于reduce要求prevcurr属于foo类型(数组类型),否则这显然无效。

1 个答案:

答案 0 :(得分:1)

您可以使用index提供的当前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;
}

有关工作样本,请参阅此TypeScript playground