Синтаксический анализ JSON с набором значений

#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