Существуют ли какие-либо функции jquery для запроса многомерных массивов аналогично DOM? - PullRequest
9 голосов
/ 07 июля 2010

Что говорит вопрос ...

Есть ли в jQuery какие-либо методы, которые позволят вам запрашивать многомерный массив объектов аналогично тому, как это делается с DOM.

Так, например, получите мне список объектов, содержащихся в многомерном массиве, имеющих некоторое совпадающее значение свойства - например, где StartOfPeriod больше указанной даты или где name == "Ben Alabaster"

Я бы хотел не изобретать колесо, если что-то уже есть.

Ответы [ 3 ]

6 голосов
/ 07 июля 2010

Вы не можете использовать синтаксис селектора, но 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 есть код, который вы можете добавить в свой проект, чтобы он работал в браузерах, в которых нет собственных реализаций.

2 голосов
/ 07 июля 2010

Вы можете найти плагин, но не в ядре jQuery.Есть несколько полезных методов массива: each, unique, inArray.В сочетании вы можете создать что-то нестандартное в соответствии с вашими потребностями.

То, что вы ищете, - это скорее набор библиотек с обходом, подобным xpath.Прототип имеет гораздо больший набор методов массива.Но все же, вероятно, не соответствует вашим точным потребностям из коробки.

Я согласен с alex , такая библиотека / расширение было бы интересно.

1 голос
/ 07 июля 2010

Я только что написал это .. Я думаю, что это работает должным образом, но это определенно можно очистить:)

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, - дело синтаксического сахара.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...