Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   поиск подструктуры в массиве json данных (https://javascript.ru/forum/misc/38528-poisk-podstruktury-v-massive-json-dannykh.html)

amt779 05.06.2013 18:05

поиск подструктуры в массиве 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
		}
	}
];


Помогите написать такую функцию.

zOdmin 05.06.2013 19:15

Обходим рекурсивно всё дерево haystack.
К каждому элементу применяем фукнцию сравнения структур,
которая в свою очередь рекурсивно обходит needle и проверяет наличие каждого подэлемента needle с соответствующим подэлементом рассматриваемого элемента haystack. В случае совпадения добавляем элемент в результирующий массив, который в конце возвращаем. Ничего сложно в написании (правда, занимает время).

amt779 06.06.2013 10:09

zOdmin,
Цитата:

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

zOdmin 07.06.2013 18:52

Цитата:

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


Так я же написал:
Цитата:

Сообщение от zOdmin (Сообщение 254626)
, которая в свою очередь рекурсивно обходит needle и проверяет наличие каждого подэлемента needle с соответствующим подэлементом рассматриваемого элемента haystack.

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

Вообще странно, что здесь что-то оказалось не ясно, т.к. это самое лобовое решение, без изысканий.

dmitriymar 07.06.2013 18:53

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

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

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


Часовой пояс GMT +3, время: 18:49.