Как искать и манипулировать сложными объектами JavaScript в стиле jQuery - PullRequest
4 голосов
/ 17 августа 2011

В контексте веб-приложения у меня есть сервер, который отправляет или получает строки JSON на основе входных данных от клиента.При использовании клиента эти строки JSON немедленно преобразуются в объекты JavaScript, где они будут жить как объекты.Эти объекты не являются массивами;они представляют собой сложные произвольные модели данных, каждое свойство которых может иметь произвольное количество уникальных подвойств или объектов.

var myView = {
    name: 'root'
    id: 'root_0'
    children: {
       child_1: {
          arbitraryid: 'root_0_child_1',
          type: 'Department',
          name: 'Produce',
          quadrant: 1,
          children: {
              child_1: {
                  arbitraryid: 'root_0_child_1_child_1',
                  type: 'Aisle',
                  number: 3,
                  length: 12,
                  children: { }
              }
          }
       },
       child_2: {
          arbitraryid: 'root_0_child_2',
          name: 'West',
          type: 'Region',
          children: {
              child_1: {
                  arbitraryid: 'root_0_child_2_child_1',
                  name: 'Wegmans',
                  type: 'Store', 
                  children: { 
                      child_1: {
                          arbitraryid: 'root_0_child_2_child_1_child_1',
                          type: 'Department',
                          children: { }
                      }
                  }
             }
          }      
       }
    }
};

Когда я создаю серверную строку JSON, я гарантирую, что у всех объектов будут дочерние объектыи произвольные свойства;но все остальное генерируется динамически, а свойства и значения совершенно произвольны.

Если бы это был XML, я мог бы использовать jQuery для var someChild = myView.find('#root_0_child_1_child_1').Это даст мне объект jQuery с результатами поиска AND не только ссылкой на myView, но и позицией , из которой можно перемещаться всенаправленно через объект: var someChild = myView.find('#root_0_child_1_child_1').parent().

Существует ли утилита для решения этой проблемы для нативных объектов JavaScript или есть предпочтительный способ / методология для этого?Я хотел бы избежать написания кода такого типа, чтобы просто получить доступ к моему свойству, а затем потенциально повторить цикл для обновления родительского объекта.

while (obj.hasOwnProperty('children')) {
   for (var child in obj) {
     //..etc, etc
   } 
}

Большинство вопросов SO, которые я вижу по этой теме, имеют дело с поисковыми массивами , , часто с предсказуемым построением стиля таблицы данных .

Картирование возможно, но эти объекты быстро становятся глубже, и этот вариант кажется немного лучше, чем тупое зацикливание.

Идеи?

Редактировать: сворачивание моего собственного служебного класса.

I 'Я до сих пор изучаю другие библиотеки / утилиты, но я написал общий вспомогательный класс для поиска:

ObjectHelper

Хотя он полезен, я думаю, что он иллюстрирует некоторые трудности сполучить в другой jQuery-подобной функциональности.Я хотел бы не только выполнять поиск, но и иметь возможность сканировать структуру свойств объекта вверх / вниз аналогично тому, как вы можете связывать операторы .parent (). Children (). Find () вместе.Выполнимо, но сложно.

Ответы [ 2 ]

2 голосов
/ 17 августа 2011

Я нашел несколько языков запросов JSON:

На этой странице подводятся итоги и рассматриваются их плюсы и минусы.

Существует также модуль DOJO для запроса JSON:

Я не уверен, насколько они стабильны / стандартны.

0 голосов
/ 07 сентября 2011

Я решил это, развернув свои собственные классы .ShadesJS в настоящее время довольно прост, но у него есть несколько методов для сканирования объектов JavaScript и работы с веб-хранилищем.Задача состоит в том, чтобы реализовать родительские / дочерние методы, чтобы получить некоторую гибкость в стиле JQuery.Это не сложно сделать, но сложно сделать это правильно и эффективно.

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