javascript - 如何归档一组必须满足javascript中所有条件的记录
问题描述
我有一组对象,它们具有基于所选对象的一些可过滤信息。
我有以下内容,并希望遍历其中的键selected
并仅返回满足所有条件的项目(在这种情况下,用户Amber
拥有tagId
12 和placementId
27)。
一个警告是,如果selected
过滤器等于 null,则应将其从过滤中排除,因为这意味着用户没有按此过滤。
这将增长到像 8 个过滤器,所以不想做一些大的 if 语句。我怎么能这样做?
var selected = {};
selected["tagId"] = 12;
selected["placementId"] = 27;
selected["locationId"] = null;
var users = [];
users.push({"name":"Joe", "tagIds":[3,4,12], "placementIds": [2,19]});
users.push({"name":"Suzy", "tagIds":[3,4], "placementIds": [2,19, 27]});
users.push({"name":"Amber", "tagIds":[1,12], "placementIds": [2,19, 27]});
function filterBySelected(items){
var hits = [];
console.log('within filter by Selected');
console.log(items);
for (var key in selected){
if(selected[key]){ //
console.log('you are filtering by: ' + key);
}
}
return hits;
}
var items = filterBySelected(users);
// items should return user object of "Amber"
解决方案
您可以使用Array#filter
and Object.entries
(或它的 polyfill),如下所示:
var selected = {tagId: 12,placementId: 27};
var users = [
{"name":"Joe", "tagIds":[3,4,12], "placementIds": [2,19]},
{"name":"Suzy", "tagIds":[3,4], "placementIds": [2,19, 27]},
{"name":"Amber", "tagIds":[1,12], "placementIds": [2,19, 27]}
];
function filterBySelected(items){
return items.filter(item =>
Object.entries(selected).every(([k, v]) =>
v == null || (item[k+"s"] || []).includes(v)
)
);
}
var items = filterBySelected(users);
console.log(items);
.as-console-wrapper { max-height: 100% !important; top: 0; }
推荐阅读
- scala - 如何正确使用服务层的IO和OptionT来理解?
- facebook - react-native with expo 问题与 facebook 广告
- python - 为什么下划线在交互模式下*仅*引用最后执行语句的结果
- laravel-5 - 无法下载“https://packagist.org/packages.json”文件
- android - 识别dataBinding类android时出错
- php - 在 Laravel 项目中集中常量
- ios - 将所有 UISwitches 设置为 OFF,除了 tableViewCell 中的当前 UISwitches
- c - C中的system()时出现分段错误
- python - 在禁用所有插件的情况下启动 pytest
- asp.net-mvc - ASP.NET MVC 单击按钮填充标签