【问题标题】:Parsing JSON multi-level array解析 JSON 多级数组
【发布时间】:2015-11-25 14:16:50
【问题描述】:

我想在具有多级数组的 json 数据中进行搜索。我的搜索列表返回我的对象​​的名称,但仅来自第一级。无论级别如何,我怎么能返回所有对象的名称? 在这个例子中:OST、OST details、Apocalpse Now、Arizona Dream、Dexter

数据

<script type="application/json" id="dataMusic">
{
"name":"Music",
"level":"1",
"size":36184,
"children":[
    {
        "name":"OST",
        "level":"2",
        "size":1416,
        "children":[
            {
                "name":"OST details",
                "level":"3",
                "size":1416,
                "children":[
                    {
                        "name":"Apocalypse Now",
                        "size":15
                    },
                    {
                        "name":"Arizona Dream",
                        "size":19
                    },
                    {
                        "name":"Dexter",
                        "size":20
                    }
                ]
             }
          ]
       }
    ]
 }
 </script>

功能

var dataMusic = document.getElementById('dataMusic').innerHTML; 
var dataTree = JSON.parse(dataMusic);   

var optArray = [];
for (var i = 0; i < dataTree.children.length - 1; i++) {
    optArray.push(dataTree.children[i].name);
    }
    optArray = optArray.sort();

我尝试这个方法Parsing Nested Objects in a Json using JS没有成功

功能

var optArray = [], Music, OST, OST details;
for (Music in dataTree) {
    for (OST in dataTree[Music]) {
        for (OST details in dataTree[Music][OST]) {
            if (OST details in optArray) {
                optArray[OST details].push(dataTree[Music][OST][OST details].name)
            } else {
                    optArray[OST details] = [dataTree[Music][OST][OST details].name] 
            }
        }
    }
}

【问题讨论】:

    标签: json parsing


    【解决方案1】:

    你必须使用嵌套循环

    for Music.children.length
        for OST.children.length
            for OST details.children.length
    

    编辑:功能

    var optArray = [], Music, OST, OST_details;
    for (Music in dataTree) {
        for (OST in dataTree[Music]) {
            for (OST_details in dataTree[Music][OST]) {
                if (OST_details in optArray) {
                    optArray[OST_details].push(dataTree[Music][OST][OST_details].name)
                } else {
                        optArray[OST_details] = [dataTree[Music][OST][OST_details].name] 
                }
            }
        }
    }
    

    【讨论】:

    • 感谢您的回答。我尝试了这种方法 [stackoverflow.com/questions/15065920/… 没有成功(语法需要;,请参阅上面的更新)。你是怎么写的?
    • 我尝试写功能,你不使用任何编辑器,请检查一下。
    • Firebug 没有返回任何错误(语法没问题),但没有返回任何对象。
    • 检查:link1link2
    • 它部分工作,Firebug 给我一个错误TypeError: cyclic object value alert(JSON.stringify(toArray(dataTree))); 同时我发现这个方法 [stackoverflow.com/questions/5189387/… 似乎工作。
    【解决方案2】:

    我明白了

    var dataMusic = document.getElementById('dataMusic').innerHTML; 
    var dataTree = JSON.parse(dataMusic);  
    var result = [];   
    
    function getAll( input, target ) {     
        function parseData( input, target ) {
            $.each( input, function ( index, obj ) {
                if ( index == target ) {
                    result.push( obj );
                }
                else {
                    switch ( $.type( obj ).toLowerCase() ) {
                        case "object":
                        case "array":
                            parseData( obj, target );
                            break;
                    }
                }
            });
        }    
        parseData( dataTree, "name" );
        result = result.sort();
        return result;
    }
    alert(JSON.stringify( getAll( dataTree, "name" )));
    

    感谢这篇文章: Parsing multi-level json ; Demo

    【讨论】:

      猜你喜欢
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-18
      • 2013-02-02
      • 2021-12-28
      • 1970-01-01
      相关资源
      最近更新 更多