javascript中的多字段比较
有没有简单明了的方法可以在下面的列表中找到具有给定的searchObject规范的项目javascript中的多字段比较,javascript,comparison,compare,Javascript,Comparison,Compare,有没有简单明了的方法可以在下面的列表中找到具有给定的searchObject规范的项目 var list = [ { id:1, name: "foo", description: "description 1" }, { id:2, name: "bar", description: "description 2" }, { id:3, name: "baz", description: "description 3" }, ]; var searchObject =
var list = [
{ id:1, name: "foo", description: "description 1" },
{ id:2, name: "bar", description: "description 2" },
{ id:3, name: "baz", description: "description 3" },
];
var searchObject = { id: 2, name: "bar" };
searchObject不一定具有列表中项目的所有属性。我需要属性之间的运算符为和(id==2&&name==“bar”)。以下是我的想法。javascript中有什么本机语言可以做到这一点吗
for (var i in list) {
var found = true;
for (var p in searchObject) {
if (list[i][p] !== searchObject[p]) {
found = false;
break;
}
}
if(found) return list[i];
}
根据我的经验,如果这个解决方案存在,它不会比你的好多少 最好不要对数组使用
for…in
语句,因为它枚举数组的属性,而不是元素。考虑以下事项:
Array.prototype.test = function () { };
for (var i in q) console.log(i);
此代码将输出test
,这可能不是您所期望的
无论如何,对于这类事情,我使用
lodash
。它的。
方法完全满足您的需要,您可以查看此方法的源代码,我认为这是最有效的实现。不,没有本地方法。有些人可能更喜欢下面的内容,因为它更javascripty,但它肯定没有原始版本所具有的卓越浏览器支持
var matches = list.filter(function(arrElem){
return Object.keys(searchObject).every(function(prop){
return searchObject[prop] === arrElem[prop];
});
});
请注意,这将返回一个包含所有匹配项的数组,而不仅仅是像您这样的第一个匹配项。还请注意,与您的不同,这不会测试searchObject
上的继承的可枚举属性,尽管您可能不想搜索继承的属性
ps,许多“我希望js有一个更好的方式做X”的愿望都得到了满足。特别是,该方法是您所追求的:
var match = _.findWhere(list, searchObject);
“javascripty”的意思是功能性?@Christopherris……也许更像是强调javascripts是命令式OO与功能性思想的独特融合。请不要在数组上使用(x in y)。