Что говорит вопрос...
Делает jQuery, имеют любые методы, которые позволят Вам запрашивать mult-размерный массив объектов подобным способом, как он делает с DOM.
Так, например, получите меня список объектов, содержавших в многомерном массиве, имеющем некоторое значение свойства соответствия - например, где StartOfPeriod, больше, чем указанная дата или где имя == "Алебастр Ben"
Я хотел бы постараться не изобретать велосипед, если уже существует что-то там.
Вы не можете использовать синтаксис селектора, но jQuery поставляется с $.grep и $.inArray, которые могут быть полезны для этого. grep
возвращает новый массив элементов, соответствующих предикату. inArray
возвращает индекс первого совпадающего элемента или -1. Например:
var matches = $.grep(array, function(el){
return el.StartOfPeriod > 2000;
});
Эти методы похожи на стандартные методы ECMAScript, Array.filter
(аналогично grep
) и Array.indexOf
(аналогично inArray
); jQuery фактически использует Array.indexOf
, где это возможно. Есть и другие полезные методы ECMAScript, такие как Array.every
(совпадение всех элементов) и Array.some
(совпадение хотя бы одного элемента). MDC предлагает код, который вы можете добавить в свой проект, чтобы эти методы работали в браузерах, не имеющих собственных реализаций.
Вы можете найти плагин, но не в ядре jQuery. Есть несколько полезных методов массивов: each
, unique
, inArray
. В сочетании с ними вы можете создать нечто индивидуальное, отвечающее вашим потребностям.
То, что вы ищете, больше похоже на библиотеку наборов с xpath-подобным обходом. Prototype имеет гораздо больший набор методов массивов. Но все равно, вероятно, не сможет удовлетворить ваши потребности из коробки.
Я согласен с alex, такая библиотека/расширение было бы интересно.
Я только что написал это ... Я думаю, что он работает правильно, но его определенно можно очистить :)
function findMatchingObjects(obj, member, value){
var final = new Array();
var temp = new Array();
for(var p in obj){
if (typeof obj[p] == 'object' ) {
temp = findMatchingObjects(obj[p], member, value);
if (temp.length == 1)
final.push(temp[0]);
}
if (p == member && obj[p] == value) {
final.push(obj);
}
}
alert(final.length);
return final;
}
Используйте его так:
var moo ={baz: 1, boo: 2, bar:{c1: 3, c2: 4, c3:{t:true, f:false, baz:1}},d: 11};
var foo = findMatchingObjects(moo, "baz", 1);
// did it work?
console.log(foo);
Возвращает массив объектов (или подобъектов ), которые соответствуют паре член-значение. В этом случае foo
содержит как moo
, так и c3
, поскольку оба объекта содержат пару baz = 1
.
Чтобы функция выглядела и ощущалась как селектор jQuery, достаточно лишь синтаксического сахара.