javascript中的多字段比较

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 =

有没有简单明了的方法可以在下面的列表中找到具有给定的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)