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)
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)
使用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(...)
最好,最快的方法是
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)
如果您的数组实际上是一组 JQuery 对象,那么简单地使用.filter()方法怎么样?
purposeObjects.filter('[purpose="daily"]')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
112274 次 |
| 最近记录: |