jQuery:数组中元素索引的谓词
我有一个对象数组。 每个对象都具有ID属性。 我想在具有特定ID的对象数组中找到索引。 在jQuery中有没有优雅而简单的方法呢?
在这种情况下,您应该在javascript中使用for
循环而不是使用jQuery。 请参阅http://net.tutsplus.com/tutorials/javascript-ajax/10-ways-to-instantly-increase-your-jquery-performance/中的方法3
更新: jQuery是用javascript编写的,它不能比在javascript中编写的另一个代码更快。 如果你使用DOM,jQuery是非常好的,但如果你正在使用简单的javascript数组或对象,那就没有用。
您正在寻找的代码可能是这样的:
for (var i=0, l = ar.length; i
重要的是你应该保留一些简单的javascript规则:始终声明局部变量(不要忘记变量声明前的var
)并缓存在局部变量中ar.length
使用的任何属性或索引(如上面的ar.length
)。 (例如参见http://wiki.forum.nokia.com/index.php/JavaScript_Performance_Best_Practices )
请参见[`Array.filter`] [1]以使用回调函数过滤数组。 数组中的每个对象将逐个传递给回调函数。 如果要包含该值,则回调函数必须返回“true”,否则返回false。 var matchingIDs = objects.filter(function(o){ return o.ID == searchTerm; }); 具有ID为searchTerm的所有对象将作为数组返回到matchingIDs。 从第一个索引获取匹配元素(假设ID是唯一的,并且只有一个) matchingIDs [0]; [1]:https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/filter
更新:
来自ECMAScript 6的findIndex
。
items.findIndex(function(item) { item.property == valueToSearch; });
由于findIndex
尚未在大多数浏览器上提供,您可以使用此实现回填它:
if (!Array.prototype.findIndex) { Array.prototype.findIndex = function(predicate) { if (this == null) { throw new TypeError('Array.prototype.findIndex called on null or undefined'); } if (typeof predicate !== 'function') { throw new TypeError('predicate must be a function'); } var list = Object(this); var length = list.length >>> 0; var thisArg = arguments[1]; var value; for (var i = 0; i < length; i++) { value = list[i]; if (predicate.call(thisArg, value, i, list)) { return i; } } return -1; }; }
不是很优雅,但是一个可爱的伎俩:
var index = parseInt( $.map(array, function(i, o) { return o.id === target ? i : ''; }).join('') );
jQuery没有很多像这样的function结构; 图书馆的哲学真正专注于DOM争论的工作。 他们甚至不会添加.reduce()
函数,因为没有人能想到它对核心function有用的原因。
Underscore.js库有很多这样的设施,它与jQuery“玩得很好”。
没有内置的方法; [].indexOf()
方法不接受谓词,所以你需要一些自定义的东西:
function indexOf(array, predicate) { for (var i = 0, n = array.length; i != n; ++i) { if (predicate(array[i])) { return i; } } return -1; } var index = indexOf(arr, function(item) { return item.ID == 'foo'; });
如果谓词永远不会产生真值,则该函数返回-1。
使用jOrder。 http://github.com/danstocker/jorder
将数组送入jOrder表,并在“ID”字段上添加索引。
var table = jOrder(data) .index('id', ['ID']);
然后,通过以下方式获取元素的数组索引:
var arrayidx = table.index('id').lookup([{ ID: MyID }]);
如果你想要整行,那么:
var filtered = table.where([{ ID: MyID }]);
瞧。