2016-12-05 1 views
2

У меня есть массив объектов, скажемВычислить состояние рекурсивно с помощью map/reduce?

let objs: foo[]; 

непреложный состояние объекта

let state: State; 

и функция

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

Так transform вычисляет новый State от предыдущего использования информация с текущего obj; если вы думаете, что «звучит как Redux для меня», вы можете быть правы.

Есть ли способ вызова transform рекурсивно для каждого объекта из массива такой, что каждый рассчитывается state является входным параметром для следующего вызова с использованием transformmap и reduce? Меня интересует только финальный номер state.

Я пытался что-то вроде

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

reduce но требует prev и curr быть типа foo (тип массива), это не будет работать, очевидно.

+0

Вы пробовали 'objs.foreach (х => this.transform (состояние, х))' ? – Rajesh

+1

Это звучит так: 'сокращение' - это то, что вы ищете, за исключением * рекурсивной * части. Вы говорите, что у ваших объектов есть собственное свойство, которое представляет собой массив (?), Который вы хотите рекурсивно «уменьшить»? Вы запрашиваете рекурсивную реализацию 'reduce'? – deceze

+0

Возможно, мне что-то не хватает, но я не понимаю, почему рекурсия включена. – haim770

ответ

1

Вы можете использовать текущий index обеспечивается Array.prototype.reduce:

return objs.reduce((prev, next, index) => transform(prev, objs[index]), state); 

Но этот путь вы вид от злоупотребления функции reduce. Имо это должно и может быть сделано с регулярным forEach заявление:

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

    return state; 
} 

Смотрите эту TypeScript playground для рабочих образцов

Смежные вопросы