【问题标题】:is it possible to write a utility function to parse this JSON format?是否可以编写一个实用程序函数来解析这种 JSON 格式?
【发布时间】:2014-06-05 17:20:02
【问题描述】:
{
    "item": {
        "T1": [{
            "name": "Snacks",
                "T2": [{
                "name": "Popcorn",
                    "T3": [{
                    "name": "Packet",
                        "T4": [{
                        "leaf": [{
                            "name": "popcorn packet caramel",
                                "price": 20
                        }, {
                            "name": "popcorn packet cheese",
                                "price": 30
                        }]
                    }]
                }]
            }]
        }, {
            "name": "Beverages",
                "T2": [{
                "name": "Pepsi",
                    "T3": [{
                    "name": "Bottle",
                        "leaf": [{
                        "name": "pepsi bottle 250ml",
                            "price": 50
                    }, {
                        "name": "pepsi bottle 350ml",
                            "price": 60
                    }]
                }, {
                    "name": "Can",
                        "leaf": [{
                        "name": "pepsi can 250ml",
                            "price": 50
                    }, {
                        "name": "pepsi can 100ml",
                            "price": 40
                    }]
                }]
            }]
        }]
    }
}

如果您观察上面的 JSON,每个数组都有 name 属性,除了 leaf 级别

例如

T1 有两个名字Snacks and Beverages

小吃有一个名字爆米花

爆米花有一个名字

===========================

饮料有两个名字百事可乐

百事可乐有两个名字Bottle和Can

如果给定了一个值,我已经用这种方式编写了一个函数来返回值

$(document).ready(function () {
    for (var a = 0; a < jsondata.item.T1.length; a++) {
        if (jsondata.item.T1[a].name == 'Snacks') {
            for (var b = 0; b < jsondata.item.T1[a].T2.length; b++) {
                for (var c = 0; c < jsondata.item.T1[a].T2[b].T3.length; c++) {
                    for (var d = 0; d < jsondata.item.T1[a].T2[b].T3[c].T4.length; d++) {
                        for (var e = 0; e < jsondata.item.T1[a].T2[b].T3[c].T4[d].leaf.length; e++) {
                            console.log(jsondata.item.T1[a].T2[b].T3[c].T4[d].leaf[e].name);
                        }
                    }
                }
            }
        }
    }
});

我的问题:是否有可能编写一个实用函数来接受一个值并返回它存在的值?

【问题讨论】:

    标签: jquery


    【解决方案1】:

    玩了一点,但这很有效:

    DEMO

    function isArray(what) {
        return Object.prototype.toString.call(what) === '[object Array]';
    }
    
    function isObject(what) {
        return Object.prototype.toString.call(what) === '[object Object]';
    }
    
    var results = [];
    var cancel = false;
    
    function recursiveSearch(name, json, startSaving, parentJson) {
        if (cancel) return;
        if (startSaving) {
            if (parentJson["leaf"]) {
                results.push(parentJson["leaf"]);
                cancel = true; //pushing leaf twice for somereason, work around with 'cancel'
                return;
            } else if (json["leaf"]) {
                results.push(json["leaf"]);
                cancel = true; //pushing leaf twice for somereason, work around with 'cancel'
                return;
            } else if (json["name"]) {
                results.push(json["name"]);
                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 search(name) {
        results = [];
        cancel = false;
        recursiveSearch(name, jsondata);
        console.log(results);
    }
    
    console.log('Search for "T1"');
    search('T1');
    console.log('Search for "T2"');
    search('T2');
    console.log('Search for "T3"');
    search('T3');
    console.log('Search for "Snacks"');
    search('Snacks');
    console.log('Search for "Popcorn"');
    search('Popcorn');
    console.log('Search for "Packet"');
    search('Packet');
    console.log('Search for "Beverages"');
    search('Beverages');
    console.log('Search for "Pepsi"');
    search('Pepsi');
    console.log('Search for "Bottle"');
    search('Bottle');
    console.log('Search for "Can"');
    search('Can');
    

    【讨论】:

    • 感谢 Micheal,但问题被误解或我错了。我想要的是每个数组下面都有名称,例如,如果给定 T1,我需要它下面的名称是 Snacks and Beverages ,同样我给出值 Snacks ,它必须返回 Popcorn
    • 我还是不明白。也许对您想要的输入和输出进行伪编码。喜欢search('T1') = ["snacks","beverages"]
    • 同时使用“价值”这个词非常令人困惑。这些 Json 对象中的每一个都具有属性-对象/数组/值关系。 name 属性有一个值。许多其他属性链接到对象或数组。因此,编辑您的问题以包含黑盒功能及其预期结果将大大有助于了解您的需求。
    • 您想要多个功能?我以为您想要一个可以返回所有内容的实用程序函数。基于一些参数。
    猜你喜欢
    • 2018-08-26
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    • 2016-12-31
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 2023-03-05
    相关资源
    最近更新 更多