同时执行filter + map的最有效方法是将数据作为泛型可迭代对象处理,并同时执行这两件事。在这种情况下,您最多只需要浏览一次数据。
下面的例子是使用iter-ops库,并做到了这一点:
import {pipe, filter, map} from 'iter-ops';
const i = pipe(
inputArray,
filter(value => value === 123), // filter on whatever key you want
map(value => /* any mapping here*/) // remap data as you like
);
// i = iterable that can be processed further;
console.log([...i]); //=> list of new objects
上面,我说的是最多,因为如果你对iterable结果应用进一步的逻辑,比如限制映射项的数量,例如,你最终会迭代对象列表甚至少于一次:
const i = pipe(
inputArray,
filter(value => value === 123), // filter on whatever key you want
map(value => /* any mapping here*/), // remap as you like
take(10) // take up to 10 items only
);
在上面,我们进一步限制迭代,一旦生成了10个结果项就停止,因此我们对数据的迭代少于一次。这是最有效的了。
更新
我被要求补充为什么这种解决方案比减少更有效,所以就是这样……
数组的约简是一个有限的操作,它遍历完整的数据集,以产生结果。因此,当您需要对输出数据进行进一步处理时,您将最终生成一个新的迭代序列,等等。
当您有一个复杂的业务逻辑要应用到一个序列/可迭代对象时,将该逻辑链接起来总是更有效的,而只遍历序列一次。在许多情况下,您最终会对一个序列进行复杂的处理,甚至一次都不遍历完整的数据集。这就是可迭代数据处理的效率。
附注:我是上述图书馆的作者。