我已经将这些伟大的答案转化为实用函数,并想分享它们:
示例:仅过滤奇数并递增
例如:[1, 2, 3, 4, 5] - 过滤 -> [1, 3, 5] - 映射 -> [2, 4, 6]
通常您会使用filter和map来执行此操作。
const inputArray = [1, 2, 3, 4, 5];
const filterOddPlusOne = inputArray.filter((item) => item
使用reduce函数
const filterMap = <TSource, TTarget>(
items: TSource[],
filterFn: (item: TSource) => boolean,
mapFn: (item: TSource) => TTarget
) =>
items.reduce((acc, cur): TTarget[] => , [] as TTarget[]);
使用flatMap
const filterMap = <TSource, TTarget>(
items: TSource[],
filterFn: (item: TSource) => boolean,
mapFn: (item: TSource) => TTarget
) => items.flatMap((item) => (filterFn(item) ? [mapFn(item)] : []));
用法(对于reduce
和flatMap
解决方案相同):
const inputArray = [1, 2, 3, 4, 5];
const filterOddPlusOne = filterMap(
inputArray,
(item) => item % 2, // Filter only odd numbers
(item) => item + 1 // Increment each number
); // [ 2, 4, 6 ]
JavaScript 版本
上述代码为 TypeScript,但问题要求使用 JavaScript。因此,我已经为您删除了所有泛型和类型:
const filterMap = (items, filterFn, mapFn) =>
items.reduce((acc, cur) => {
if (filterFn(cur)) return [...acc, mapFn(cur)];
return acc;
}, []);
const filterMap = (items, filterFn, mapFn) =>
items.flatMap((item) => (filterFn(item) ? [mapFn(item)] : []));
.reduce()
比.filter(...).map(...)
更快,这一点已经被其他人提出来了。我设置了一个JSPerf测试来证明 https://dev59.com/ol8d5IYBdhLWcg3wiSnI#47877054 - Justin L.