同时使用数组的过滤和映射功能?

3

我感觉自己像个白痴,但我需要过滤我的数组,然后映射这些值,但这样做的时间复杂度是O(2N),如果能够使用一个常规的Array.prototype函数来完成所有操作的时间复杂度为O(N)会更合理,但我找不到这样的函数。

array.filter(item => !!item.revenue).map(item => item.revenue)

我总是可以自己编写方法,但最好使用经过性能优化的Array.prototype方法,如果有的话。


听起来你想要另一种像reduce的方法。 - epascarello
1
牺牲可读性是否真的值得为了多一次迭代而交换? - zerkms
@zerkms 不好意思,我回滚了,我有点困惑。 - neaumusic
3
@AlexeiLevenkov说:"O(n)和O(2n)是等价的" --- 常数仍然很重要。O(n)O(1000000n)之间的区别:后者会运行慢大约1百万倍。 - zerkms
2
不要假设原型方法会像简单循环一样快。while循环和forEach是一个很好的例子。 - charlietfl
显示剩余4条评论
2个回答

6

那么关于 Array.prototype.reduce() 呢?

arr.reduce((newArr, item) => {
    if (!!item.revenue) {
        newArr.push(item.revenue)
    }
    return newArr
}, []);

当时我看到了reduce,但没有意识到你可以构建一个数组,我以为只能是一个单一的变量,谢谢。 - neaumusic
缺点是,与map不同,这个函数不会预先分配空间。因为它无法知道有多少项将被过滤掉。 - Oriol
2
@Oriol “下降”相对于什么?您不能仅使用Array.prototype.map解决问题。 - zerkms
1
刚在nodejs 6.2.2 (V8 5.0.71.52)上测试了它们,这比filter和map快了约4倍。 - David Conrad
1
@DavidConrad 很高兴你能回来并提供一些统计数据。 - Phil
显示剩余3条评论

1

flatMap可用于过滤和映射组合的情况:

arr.flatMap(item => item.revenue || [])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接