通过几个函数映射数组项

时间:2017-08-27 09:09:04

标签: javascript typescript

是否有更多优雅方式,然后为数组中的每个项目连续执行多个函数:

if x in ['K','Q','J']:

2 个答案:

答案 0 :(得分:6)

这是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
    )
  );
}

直播示例:

&#13;
&#13;
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);
&#13;
&#13;
&#13;

正如Nitzan Tomer所指出的那样,我们可以取消items常数:

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

我经常保留那些用于调试的东西,但是一些好的调试器现在可以让它们在返回之前很容易看到函数的返回值(Chrome就是这样),所以如果删除它,你可以进入getItems要查看map之前的项目。

答案 1 :(得分:0)

根据@ T.J.Crowder的答案,这里有一个更可重复使用的版本:

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) );
}

请注意,类型是从getItems(input)推断出来的,返回类型是transform(): Item[]