首页 > 解决方案 > 如何归档一组必须满足javascript中所有条件的记录

问题描述

我有一组对象,它们具有基于所选对象的一些可过滤信息。

我有以下内容,并希望遍历其中的键selected并仅返回满足所有条件的项目(在这种情况下,用户Amber拥有tagId12 和placementId27)。

一个警告是,如果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"

标签: javascript

解决方案


您可以使用Array#filterand 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; }


推荐阅读