Jquery如何在Array中按属性查找Object

Jes*_*sen 63 collections jquery traversal filter

鉴于我有一系列"目的"对象:

//array of purpose objects:
var purposeObjects = [
    {purpose: "daily"},
    {purpose: "weekly"},
    {purpose: "monthly"}
];
Run Code Online (Sandbox Code Playgroud)

(为简单起见,我省略了其他属性)

现在我想要一个方法,如果找到匹配的目的名称,则返回特定的一个对象.

这不起作用:

function findPurpose(purposeName){
    return $.grep(purposeObjects, function(){
      return this.purpose == purposeName;
    });
};

findPurpose("daily");
Run Code Online (Sandbox Code Playgroud)

但它实际上返回一个空数组:

[]
Run Code Online (Sandbox Code Playgroud)

我正在使用JQuery 1.5.2.我也试过$ .each()但没有运气.显然,大多数JQuery方法都是为DOM元素(如filter().

关于如何实现这一点的任何想法?

Luc*_*oli 79

最快的方式(即使没有jQuery也能正常工作):

    array.find((o) => { return o[propertyName] === propertyValue })
Run Code Online (Sandbox Code Playgroud)

注意

jQuery $ .grep(或其他过滤函数)不是最佳解决方案.

find函数将循环遍历数组的所有元素,即使在循环期间已找到搜索的对象.从jQuery grep文档:

$ .grep()方法根据需要从数组中删除项目,以便所有剩余项目都通过提供的测试.测试是一个传递数组项的函数和数组中项的索引.仅当测试返回true时,该项才会位于结果数组中.


And*_*rei 37

你应该在grep函数中传递项目的引用:

function findPurpose(purposeName){
    return $.grep(purposeObjects, function(item){
      return item.purpose == purposeName;
    });
};
Run Code Online (Sandbox Code Playgroud)

  • 完全同意Luca:$ .grep()循环遍历整个对象,即使你在条件中返回!在较小的物体中,这可能并不重要,但是如果物体真的很大,比如直到2034年的日历呢?我选择Luca Fagioli的解决方案是最好的答案 (2认同)

Joh*_*ann 29

我个人使用一个更通用的函数,适用于任何数组的任何属性:

function lookup(array, prop, value) {
    for (var i = 0, len = array.length; i < len; i++)
        if (array[i] && array[i][prop] === value) return array[i];
}
Run Code Online (Sandbox Code Playgroud)

你只需这样称呼它:

lookup(purposeObjects, "purpose", "daily");
Run Code Online (Sandbox Code Playgroud)


Jes*_*sen 26

错误是您无法this在grep中使用,但必须使用对元素的引用.这有效:

function findPurpose(purposeName){
    return $.grep(purposeObjects, function(n, i){
      return n.purpose == purposeName;
    });
};

findPurpose("daily");
Run Code Online (Sandbox Code Playgroud)

收益:

[Object { purpose="daily"}]
Run Code Online (Sandbox Code Playgroud)

  • 完全同意Luca:$ .grep()循环遍历整个对象,即使你在条件中返回!在较小的物体中,这可能并不重要,但是如果物体真的很大,比如直到2034年的日历呢?我选择Luca Fagioli的解决方案是最好的答案 (2认同)

jbo*_*ins 5

使用Underscore.js findWhere函数(http://underscorejs.org/#findWhere):

var purposeObjects = [
    {purpose: "daily"},
    {purpose: "weekly"},
    {purpose: "monthly"}
];

var daily = _.findWhere(purposeObjects, {purpose: 'daily'});
Run Code Online (Sandbox Code Playgroud)

daily 等于:

{"purpose":"daily"}
Run Code Online (Sandbox Code Playgroud)

这是一个小提琴:http://jsfiddle.net/spencerw/oqbgc21x/

要返回多个(如果你的数组中有更多),你可以使用_.where(...)


Kal*_*lim 5

最好,最快的方法是

function arrayLookup(array, prop, val) {
    for (var i = 0, len = array.length; i < len; i++) {
        if (array[i].hasOwnProperty(prop) && array[i][prop] === val) {
            return array[i];
        }
    }
    return null;
}
Run Code Online (Sandbox Code Playgroud)


Dou*_*las 5

如果您的数组实际上是一组 JQuery 对象,那么简单地使用.filter()方法怎么样?

purposeObjects.filter('[purpose="daily"]')
Run Code Online (Sandbox Code Playgroud)