#jquery
#jquery
Вопрос:
Я работаю над синтаксическим анализом JSON.
Я получил следующий JSON (также описывает путь)
{
"item": {
"T1": [
{
"name": "Ice creams",
"T2": [
{
"name": "Cone",
"T3": [
{
"name": "Frosty",
"leaf": [
{
"id": "53",
"has_topping": "0",
"price": "75",
"name": "Regular Cone, Single Scoop, Vanila ",
"image": "/JSON_images/icecream_cup_vanilla.jpg",
"Discount": 10,
"has_crust": "0"
}
]
}
]
},
{
"name": "Cup",
"T3": [
{
"name": "Frosty",
"leaf": [
{
"id": "59",
"has_topping": "1",
"price": "75",
"name": "Regular Cup, Frosty 150 Ml",
"image": "/JSON_images/icecream_cup_vanilla.jpg",
"Discount": 10,
"has_crust": "0"
}
]
}
]
},
{
"name": "Stick",
"T3": [
{
"name": "Frosty",
"leaf": [
{
"id": "60",
"has_topping": "1",
"price": "75",
"name": "Regular Stick, Frosty 70 Ml",
"image": "/JSON_images/icecream_cup_vanilla.jpg",
"Discount": 10,
"has_crust": "0"
}
]
}
]
}
]
}
]
}
}
Я получил массив пути, как показано
var patharray = [«Мороженое», «Палочка», «Морозный»] ;
Как я могу выполнить поиск в указанном выше JSON динамически по указанному выше пути, указанному внутри массива путей
Так что ответ для этого abovepatharray был бы
{
"leaf": [
{
"id": "60",
"has_topping": "1",
"price": "75",
"name": "Regular Stick, Frosty 70 Ml",
"image": "/JSON_images/icecream_cup_vanilla.jpg",
"Discount": 10,
"has_crust": "0"
}
]
}
Я получил функцию поиска, которая работает универсально (принимает один параметр и повторно возвращает значения)
Но проблема в том, что он не может определить путь и возвращает только первый найденный.
function isArray(what) {
return Object.prototype.toString.call(what) === '[object Array]';
}
function isObject(what) {
return Object.prototype.toString.call(what) === '[object Object]';
}
function addZeros(val)
{
val = "" val;
return val.length === 1 ? "0" val : val;
}
var results = [];
var cancel = false;
function recursiveSearch(name, json, startSaving, parentJson) {
if (cancel) return;
if (startSaving) {
if (parentJson["leaf"]) {
results.push("leaf");
results.push(parentJson["leaf"]);
cancel = true; //pushing leaf twice for somereason, work around with 'cancel'
return;
} else if (json["name"]) {
results.push(json["name"]);
return;
} else if (json["leaf"]) {
results.push(json["leaf"]);
cancel = true; //pushing leaf twice for somereason, work around with 'cancel'
return;
}
}
if (isArray(json)) {
for (var i = 0; i < json.length; i ) {
recursiveSearch(name, json[i], startSaving, json);
}
} else {
if (isObject(json)) {
for (key in json) {
if (key == "name") {
if (json[key] == name) {
startSaving = true;
}
} else if (key == name) {
startSaving = true;
}
recursiveSearch(name, json[key], startSaving, json);
}
}
}
}
function searchLeaf(name)
{
}
function search(name) {
results = [];
cancel = false;
recursiveSearch(name, jsondata);
return results;
}
Комментарии:
1. Не похоже, что у вас есть какой-либо JSON, у вас есть объект javascript!
Ответ №1:
Предположение или то, что я понял из вопроса — Расположение элементов в patharray соответствует пути поиска
означает — "iceCream" -> "Stick" -> "Frosty"
var patharray = ["Ice creams","Stick","Frosty"] ;
function findElement(obj, patharray, index) {
var res = '';
if(index < patharray.length) {
var searchStr = patharray[index];
index ;
for(each in obj) {
if(obj[each] instanceof Array) {
var found = false;
for(var i=0;i<obj[each].length;i ) {
if(obj[each][i].name == searchStr) {
res = obj[each][i];
if(index<patharray.length) {
console.log('search again')
res = findElement(obj[each][i], patharray, index);
}
found = true
break;
}
}
if(found) {
break;
}
}
}
return res
}
}
var patharray = ["Ice creams","Stick","Frosty"] ;
console.log(findElement(k.item, patharray, 0), 'found');
//output
Object {name: "Frosty", leaf: Array[1]}
leaf: Array[1]
0: Object
Discount: 10
has_crust: "0"
has_topping: "1"
id: "60"
image: "/JSON_images/icecream_cup_vanilla.jpg"
name: "Regular Stick, Frosty 70 Ml"
price: "75"
length: 1
name: "Frosty"
Комментарии:
1. Привет, Харприт, не могли бы вы, пожалуйста, сообщить мне, как я могу это протестировать?? Я имею в виду, что такое k.item в данном случае??
2. Ваш полный объект равен K , а 0 является начальным индексом элемента поиска из pathArray. В данном случае это будет относиться к IceCream