Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 05.06.2013, 18:05
Интересующийся
Отправить личное сообщение для amt779 Посмотреть профиль Найти все сообщения от amt779
 
Регистрация: 01.07.2011
Сообщений: 10

поиск подструктуры в массиве json данных
Имеется вот такой json-массив данных:
var haystack = [
	{
		a:{
			a1:1
			,a2:1
		}
		,b:{
			b1:2
			,b2:2
		}
	}
	,{
		a:{
			a1:1
			,a2:1
		}
		,b:{
			b1:2
			,b2:2
		}
	},{
		a:{
			a1:13
			,a2:1
		}
		,b:{
			b1:24
			,b2:2
		}
	}
];
var needle = {a:{a1:13},b:{b2:2}}


Стоит задача поиска по этому массиву. Но, искать нужно не по какому-нибудь конкретному полю, а, как бы по подструктуре члена массива json-данных.
Т.е. нужная такая функция, назвем ее sortJsonArray.

result_r = sortJsonArray(haystack,needle);


При выполнении функции получим следующее
result_r = [
	{
		a:{
			a1:13
			,a2:1
		}
		,b:{
			b1:24
			,b2:2
		}
	}
];


Помогите написать такую функцию.
Ответить с цитированием
  #2 (permalink)  
Старый 05.06.2013, 19:15
Аватар для zOdmin
Аспирант
Отправить личное сообщение для zOdmin Посмотреть профиль Найти все сообщения от zOdmin
 
Регистрация: 05.03.2012
Сообщений: 62

Обходим рекурсивно всё дерево haystack.
К каждому элементу применяем фукнцию сравнения структур,
которая в свою очередь рекурсивно обходит needle и проверяет наличие каждого подэлемента needle с соответствующим подэлементом рассматриваемого элемента haystack. В случае совпадения добавляем элемент в результирующий массив, который в конце возвращаем. Ничего сложно в написании (правда, занимает время).
Ответить с цитированием
  #3 (permalink)  
Старый 06.06.2013, 10:09
Интересующийся
Отправить личное сообщение для amt779 Посмотреть профиль Найти все сообщения от amt779
 
Регистрация: 01.07.2011
Сообщений: 10

zOdmin,
Цитата:
К каждому элементу применяем фукнцию сравнения структур,
Гениально! Как примерно должна такая функция быть устроена? Как сравнить haystack[0] с needle на совпадение структуры и значения?
Ответить с цитированием
  #4 (permalink)  
Старый 07.06.2013, 18:52
Аватар для zOdmin
Аспирант
Отправить личное сообщение для zOdmin Посмотреть профиль Найти все сообщения от zOdmin
 
Регистрация: 05.03.2012
Сообщений: 62

Сообщение от amt779 Посмотреть сообщение
zOdmin,
Гениально! Как примерно должна такая функция быть устроена? Как сравнить haystack[0] с needle на совпадение структуры и значения?

Так я же написал:
Сообщение от zOdmin Посмотреть сообщение
, которая в свою очередь рекурсивно обходит needle и проверяет наличие каждого подэлемента needle с соответствующим подэлементом рассматриваемого элемента haystack.
Осталось написать функцию, которая принимает на вход подэлемент и образец, и сравнивает их. Слово "рекурсия" понятно? Это значит, что мы в цикле обходим все элементы и сравниваем простые значения, а для объектов снова вызываем эту же функцию. Трудность только в том, как выбрать соответствующий подэлемент образца, но никто не мешает нам в очередной раз перебрать все варианты.

Вообще странно, что здесь что-то оказалось не ясно, т.к. это самое лобовое решение, без изысканий.
Ответить с цитированием
  #5 (permalink)  
Старый 07.06.2013, 18:53
х.з
Посмотреть профиль Найти все сообщения от dmitriymar
 
Регистрация: 21.11.2010
Сообщений: 4,588

Вы просите готовый скрипт с нуля.

Это работа, и за нее обычно платят деньги.
Для таких сообщений предназначен раздел форума "Работа".

Если вы все же хотите, чтобы вам помогли - приложите какие-то усилия сами и задавайте вопросы по ходу дела.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск в массиве, частичное совпадение фонарик Общие вопросы Javascript 25 04.04.2013 07:43
Сортировка JSON данных в цикле Fareastaz jQuery 12 15.03.2013 20:20
Двойная Фильтрация данных таблицы David0707 Общие вопросы Javascript 0 19.03.2012 13:00
Преобразование данных с сервера в JSON frolvict Общие вопросы Javascript 1 04.04.2010 12:26
Поиск в массиве через JavaScript Noran Общие вопросы Javascript 0 10.08.2008 17:31