3

是否有任何简短而简洁的方法可以在以下列表中找到具有给定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不一定具有列表中项目的所有属性。我需要属性之间的运算符为AND (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];
}
4

2 回答 2

3

不,没有本地方式。有些人可能更喜欢以下内容,因为它更 javascripty,但它肯定没有原始版本所具有的出色浏览器支持。

var matches = list.filter(function(arrElem){
    return Object.keys(searchObject).every(function(prop){
        return searchObject[prop] === arrElem[prop];
    });
});

请注意,这将返回一个包含所有匹配项的数组,而不仅仅是像您这样的第一个匹配项。另请注意,与您的不同,这不会测试上继承的可枚举属性searchObject,尽管您可能不想搜索继承的属性。

ps,许多“我希望 js 有更好的方式来做 X”的愿望都被underscore.js满足了。特别是,findWhere方法是您所追求的:

var match = _.findWhere(list, searchObject);
于 2013-11-10T01:03:46.253 回答
0

根据我的经验,如果解决方案存在,它不会比你的好多少。

最好不要for...in对数组使用该语句,因为它枚举的是数组的属性,而不是元素。考虑以下:

Array.prototype.test = function () { };
for (var i in q) console.log(i);

此代码将输出test可能不是您所期望的。

无论如何,对于我使用的这种东西lo-dash。它的_.find(...)方法正是你需要的,你可以看看这个方法的源代码,我认为这是最有效的实现。

于 2013-11-10T00:50:12.013 回答