代码之家  ›  专栏  ›  技术社区  ›  timpone

如何对一组必须满足javascript中所有条件的记录进行文件归档

  •  0
  • timpone  · 技术社区  · 7 年前

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

    我有以下内容,并希望在 selected 并且只返回满足所有条件的项(在本例中是用户 Amber 谁有 tagId 第12页,和 placementId 第页,共27页)。

    一个警告是如果 挑选出来的 筛选器等于空,应将其从筛选中排除,因为这意味着用户没有按空筛选。

    这将增长到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"
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   trincot Jakube    7 年前

    你可以用 Array#filter Object.entries (或多道填料)如下:

    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; }