У меня есть массив объектов. Каждый объект имеет, помимо прочего, атрибут идентификатора. Я хочу найти индекс в массиве объекта с определенным идентификатором. Есть ли какой-либо элегантный и простой способ сделать это в jQuery?
JQuery: индекс элемента в массиве, где предикат
Ответ 1
В случае, если вы используете цикл for
в javascript вместо jQuery. См. Способ 3 в http://net.tutsplus.com/tutorials/javascript-ajax/10-ways-to-instantly-increase-your-jquery-performance/
ОБНОВЛЕНО: jQuery написан на javascript, и он не может быть быстрее, чем другой код, написанный также в javascript. jQuery очень хорош, если вы работаете с DOM, но на самом деле не помогаете, если работаете с простыми массивами или объектами javascript.
Код, который вы ищете, может быть примерно таким:
for (var i=0, l = ar.length; i<l; i++) {
if (ar[i].ID === specificID) {
// i is the index. You can use it here directly or make a break
// and use i after the loop (variables in javascript declared
// in a block can be used anywhere in the same function)
break;
}
}
if (i<l) {
// i is the index
}
Важно, чтобы вы соблюдали некоторые простые правила javascript: всегда объявляйте локальные переменные (не забывайте var
перед объявлением переменной) и кэшируйте любые свойства или индексы, которые вы используете более одного раза в локальной переменной (например, ar.length
выше). (См. Например http://wiki.forum.nokia.com/index.php/JavaScript_Performance_Best_Practices)
Ответ 2
See [`Array.filter`][1] to filter an array with a callback function. Each object in the array will be passed to the callback function one by one. The callback function must return `true` if the value is to be included, or false if not. var matchingIDs = objects.filter(function(o) { return o.ID == searchTerm; }); All objects having the ID as searchTerm will be returned as an array to matchingIDs. Get the matching element from the first index (assuming ID is unique and there only gonna be one) matchingIDs[0]; [1]: https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/filterДел >
Update:
Оформить заказ findIndex
из ECMAScript 6.
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;
};
}
Ответ 3
Не очень элегантный, но симпатичный трюк:
var index = parseInt(
$.map(array, function(i, o) { return o.id === target ? i : ''; }).join('')
);
jQuery не так много функциональных конструкций; философия библиотеки действительно сфокусирована на работе DOM-споров. Они даже не добавят функцию .reduce()
, потому что никто не может подумать о причине, которая была бы полезной для основных функций.
В библиотеке Underscore.js много таких возможностей, и она "играет хорошо" с jQuery.
Ответ 4
Для этого нет встроенных методов; метод [].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, если предикат никогда не дает правдивого значения.
Ответ 5
Используйте 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 }]);
Voila.