javascript - 一次数组多个过滤器和变量赋值
问题描述
我有以下forEach
声明:
reviews.forEach(review => {
if (review.timestamp >= beforeThreeMonthsDate) {
lastThreeMonths.push(review);
}
if (review.timestamp >= beforeSixMonthsDate) {
lastSixMonths.push(review);
}
if (review.timestamp >= beforeOneYearDate) {
lastYear.push(review);
}
if (review.timestamp >= beforeTwoYearsDate) {
lastTwoYear.push(review);
}
});
有没有办法通过使用或任何新的ES6功能在列表中循环一次来获得相同的结果reviews
filter
解决方案
它会稍微改变输出,但是您可以reduce
更改为对象。而不是 4 个单独的变量。
const {
lastThreeMonths,
lastSixMonths,
lastYear,
lastTwoYear
} = reviews.reduce(
(groups, review) => {
if (review.timestamp >= beforeThreeMonthsDate) {
groups.lastThreeMonths.push(review);
}
if (review.timestamp >= beforeSixMonthsDate) {
groups.lastSixMonths.push(review);
}
if (review.timestamp >= beforeOneYearDate) {
groups.lastYear.push(review);
}
if (review.timestamp >= beforeTwoYearsDate) {
groups.lastTwoYear.push(review);
}
},
{ lastThreeMonths: [], lastSixMonths: [], lastYear: [], lastTwoYear: [] }
);
这真的很像一个groupBy
函数。
但我会考虑如何使用这些信息。如果是用于视图层,我会考虑排序,然后使用takeUntil
类型函数来提高灵活性。如果您需要lastWeek
,lastDay
那么以前的和原始的解决方案可能会变得笨拙。
const takeUntil = (pred, list) =>
list.reduce((taken, next) => (pred(next) ? taken.concat(next) : taken), []);
const sinceTwoDays = takeUntil(review => review.timestamp >= twoDaysAgo, reviews);
这种方式至少循环 2 次,但它提供了很多未来的灵活性。您可以传递任何日期并返回它。
推荐阅读
- node.js - 在 nodejs 上构建自定义动态和静态文件传递
- php - 即使有正确的权限,Symfony 也无法在 CentOS 7 上的缓存文件夹中写入
- javascript - 在 HTML 中绑定 JS 金字塔
- c# - c#左移运算符<<作为«for循环»«迭代器»
- computer-vision - 如何在给定距离计算相机的截锥体矩形?
- android - FireStore anyQuery.onComplete() 将始终在主线程上运行?这很奇怪
- java - 在Android(Java)中一首一首的播放歌曲
- objective-c - 编写退出objective-c类的快速协议
- junit - junit 5 如何重做 testng.xml
- docker - 从 jenkins 暴露 minikube 的 docker 守护进程