gpt4 book ai didi

javascript - 过滤javascript对象

转载 作者:行者123 更新时间:2023-11-30 13:23:10 25 4
gpt4 key购买 nike

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

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

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

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

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

提前致谢,问候

最佳答案

你可以使用类似这样的东西来比较两个 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'},它会找到同时具有这两种状态的记录=5 和配置文件 = 学生。要改为执行 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];
});
}

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

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

关于javascript - 过滤javascript对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9501223/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com