Elements of an array of an array through several functions

Is there a more elegant way for this to perform several functions in a row for each element of the array:

type Transform<T> = (o: T) => T; type Item = { /* properties */ }; transform(input, transformers: Transform<Item>[]) { const items: Item[] = getItems(input); return items.map(item => { let transformed = item; tramsformers.forEach(t => transformed = t(transformed)); return transformed; }) } 
+5
source share
2 answers

This is a great option for reduce :

 transform(input, transformers: Transform<Item>[]) { const items: Item[] = getItems(input); return items.map(item => transformers.reduce((val, transformer) => transformer(val), item)); } 

Or perhaps more readably:

 transform(input, transformers: Transform<Item>[]) { const items: Item[] = getItems(input); return items.map( item => transformers.reduce( (val, transformer) => transformer(val), item ) ); } 

Live example:

 function getItems(input) { return [ "abcdefg", "1234567" ]; } function transform(input, transformers) { const items = getItems(input); return items.map(item => transformers.reduce((val, transformer) => transformer(val), item)); } const result = transform("x", [ v => v.toUpperCase(), v => v.substring(1, v.length - 1) ]); console.log(result); 

As Nitzan Tomer points out, we could end the items constant:

 transform(input, transformers: Transform<Item>[]) { return getItems(input).map( item => transformers.reduce( (val, transformer) => transformer(val), item ) ); } 

I often use these things for debugging, but some good debuggers can now easily see the return value of functions before returning them (Chrome does), so if you deleted it, you can go to getItems before see the elements in front of the map .

+6
source

Here's a slightly more reusable version based on @TJCrowder's answer:

 export type Transform<T> = (o: T) => T; export function pipe<T>(sequence: Transform<T>[] = []) { return (item: T) => sequence.reduce((value, next) => next(value), item); } transform(input, transformers?) { return getItems(input).map( pipe(transformers) ); } 

Note that the type is inferred from getItems(input) , and the return type is transform(): Item[] .

0
source

Source: https://habr.com/ru/post/1271266/


All Articles