您可以使用这样的事情来比较两个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
匹配,在上面的代码中用some()
代替every()
。
按照您评论,上述功能可以通过添加一个比较功能作为一个参数被概括:
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'包含'other'的单词。我想我必须有2'包含'功能 – jose 2012-02-29 15:47:53
@ jose:看到更新... – georg 2012-02-29 16:01:33
非常感谢 – jose 2012-02-29 16:09:40