【问题标题】:Multiple fields comparison in javascriptjavascript中的多个字段比较
【发布时间】:2013-11-10 00:31:05
【问题描述】:

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

【问题讨论】:

标签: javascript comparison compare


【解决方案1】:

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

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

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

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

var match = _.findWhere(list, searchObject);

【讨论】:

  • “javascripty”是指功能性的?
  • @ChristopherHarris 有点...可能更像是强调 JavaScript 独特地融合了命令式 OO 和功能性思想。
【解决方案2】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    • 2012-01-19
    • 2020-01-18
    • 1970-01-01
    相关资源
    最近更新 更多