有没有比这个更优雅的方法来为数组中的每个项目连续执行几个函数:
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;
})
}
最佳答案
这是 reduce
的一个很好的用例:
transform(input, transformers: Transform<Item>[]) {
const items: Item[] = getItems(input);
return items.map(item => transformers.reduce((val, transformer) => transformer(val), item));
}
或者更易读:
transform(input, transformers: Transform<Item>[]) {
const items: Item[] = getItems(input);
return items.map(
item => transformers.reduce(
(val, transformer) => transformer(val),
item
)
);
}
实例:
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);
正如 Nitzan Tomer 指出的那样,我们可以取消 items
常量:
transform(input, transformers: Transform<Item>[]) {
return getItems(input).map(
item => transformers.reduce(
(val, transformer) => transformer(val),
item
)
);
}
我经常保留这些东西用于调试,但现在一些好的调试器可以很容易地在函数返回之前查看函数的返回值(Chrome 的),所以如果你删除它,你可以进入 getItems
查看 map
之前的项目。
关于javascript - 通过几个函数映射数组项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45903387/