【问题标题】:filter javascript object过滤 javascript 对象
【发布时间】:2012-02-29 14:49:38
【问题描述】:

我有一个 javascript 对象,可能是这样的

{
    "users": [{
        "id": "52",
        "name": "User name one",
        "profile": "student",
        "statusId": 1
    },...

我想在给定一组参数的情况下修改这个对象的属性。基本上我想要一个新对象,它的属性可以匹配一组约束 - 一个过滤器对象 - 使用这种形式(空过滤器):

    var userFilter = {
        id : "",
        name: "",
        profile : "",
        state : ""
    };

我见过Array.prototype.filter,但无法找到一种干净通用的方式来使用过滤器的所有属性。我已经用一个连接所有过滤器并使用 eval() 的 javascript 字符串尝试了这种方法,但我不喜欢这种方法。有什么建议吗?

提前致谢, 问候

【问题讨论】:

    标签: javascript object filter


    【解决方案1】:

    您可以使用类似的方法来比较两个 Javascript 对象:

    // returns true if "obj" contains "other" as a subset
    contains = function(obj, other) {
        return Object.keys(other).every(function(key) {
            return other[key] == obj[key];
        });
    }
    

    例如,contains(users[0], {profile: 'student'} ) 返回true

    有了这个,剩下的就简单了:

     userFilter = { ...criteria... }
     results = users.filter(function(item) { return contains(item, userFilter) })
    

    注意这会匹配AND,也就是说,如果过滤器是{state:5, profile:'student'},它会找到state=5 和profile=student 的记录。要改为进行OR 匹配,请将上述代码中的every() 替换为some()

    根据您的评论,可以通过添加比较函数作为参数来概括上述函数:

    contains = function(obj, other, compare) {
        return Object.keys(other).every(function(key) {
            return compare ? compare(key, obj[key], other[key]) 
                : obj[key] == other[key];
        });
    }
    

    比较函数接受键、对象值和过滤器值,应该返回真或假。示例:

    user =  {
           "id": "52",
           "name": "Foo Bar"
    }
    
    // this uses the default "equals" comparison and fails
    contains(user, { name: "Foo" });
    
    // this uses a custom "indexOf" comparison and succeeds 
    contains(user, { name: "Foo" }, function(key, val, flt) {
        return val.indexOf(flt) >= 0;
    });
    

    【讨论】:

    • 好方法。我无法测试相等的对象,即。对于 id,我必须找到一个完全匹配的,但如果“obj”包含“其他”的话,名称应该是。我想我必须有 2 个“包含”功能
    猜你喜欢
    • 2020-05-29
    • 2015-09-28
    • 1970-01-01
    • 2021-04-11
    • 2012-11-15
    • 2021-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多