如何使用jquery按对象顺序对对象中的json进行排序

如何使用jquery按对象顺序对对象中的json进行排序

问题描述:

嘿,我想对这个json进行排序。如何使用jquery按对象顺序对对象中的json进行排序

{ 
    "id": "1", 
    "parentId": "", 
    "children": [ 
     { 
      "id": "1.1", 
      "parentId": "1", 
     }, 
     { 
      "id": "1.2", 
      "parentId": "1", 
     }, 
     { 
      "id": "1.3", 
      "parentId": "1", 
     }, 
     { 
      "id": "1.4", 
      "parentId": "1", 
     }, 
     { 
      "id": "1.1.1", 
      "parentId": "1.1", 
     }, 
     { 
      "id": "1.1.2", 
      "parentId": "1.1", 
     }, 
     { 
      "id": "1.1.3", 
      "parentId": "1.1", 
     }, 
     { 
      "id": "1.1.1.1", 
      "parentId": "1.1.1", 
     }, 
     { 
      "id": "1.1.1.2", 
      "parentId": "1.1.1", 
     }, 

    ] 
} 

json应该以树格式排序。如果对象的parentid与其他对象的id相匹配,则此类对象将处于对象之下,以此类推到第n个级别。

预期输出应该是这样的:

{ 
    "id": "1", 
    "parentId": "", 
    "children": [ 
     { 
      "id": "1.1", 
      "parentId": "1", 
      "children": [ 
       { 
        "id": "1.1.1", 
        "parentId": "1.1", 
        "children": [ 
         { 
          "id": "1.1.1.1", 
          "parentId": "1.1.1", 
          "children": [] 
         }, 
         { 
          "id": "1.1.1.2", 
          "parentId": "1.1.1", 
          "children": [] 
         }, 
        ] 
       }, 
       { 
        "id": "1.1.2", 
        "parentId": "1.1", 
        "children": [] 
       }, 
       { 
        "id": "1.1.3", 
        "parentId": "1.1", 
        "children": [] 
       }, 
      ] 
     }, 
     { 
      "id": "1.2", 
      "parentId": "1", 
      "children": [] 
     }, 
     { 
      "id": "1.3", 
      "parentId": "1", 
      "children": [] 
     }, 
     { 
      "id": "1.4", 
      "parentId": "1", 
      "children": [] 
     }, 
    ] 
} 

我尝试,但它显示的是仅高达3级。

$(document).ready(function() { 
 
\t 
 
\t var json = JSON.parse(`{ 
 
    "id": "1", 
 
    "parentId": "", 
 
    "children": [ 
 
     { 
 
      "id": "1.1", 
 
      "parentId": "1" 
 
     }, 
 
     { 
 
      "id": "1.2", 
 
      "parentId": "1" 
 
     }, 
 
     { 
 
      "id": "1.3", 
 
      "parentId": "1" 
 
     }, 
 
     { 
 
      "id": "1.4", 
 
      "parentId": "1" 
 
     }, 
 
     { 
 
      "id": "1.1.1", 
 
      "parentId": "1.1" 
 
     }, 
 
     { 
 
      "id": "1.1.2", 
 
      "parentId": "1.1" 
 
     }, 
 
     { 
 
      "id": "1.1.3", 
 
      "parentId": "1.1" 
 
     }, 
 
     { 
 
      "id": "1.1.1.1", 
 
      "parentId": "1.1.1" 
 
     }, 
 
     { 
 
      "id": "1.1.1.2", 
 
      "parentId": "1.1.1" 
 
     } 
 
    ] 
 
}`); 
 

 
\t var dummyParnt = json.children; 
 
\t var dummyChild = json.children; 
 

 
\t var dataGrand= json; 
 
\t 
 
\t var data=[]; 
 

 
\t var init = function() { 
 
\t \t var children=[]; 
 
\t \t dataGrand.children=[]; 
 

 
\t \t var k,j=0; 
 

 
\t \t 
 
\t \t for(var i in dummyParnt){ 
 

 
\t \t \t if(dummyParnt[i].parentId == json.id){ 
 

 
\t \t \t \t dataGrand.children[j] = dummyParnt[i]; 
 
\t \t \t \t dataGrand.children[j].children =[]; 
 
\t \t \t \t 
 
\t \t \t \t k=0; 
 
    \t \t \t for(var a in dummyChild){ 
 

 

 
    \t \t \t \t if(dummyParnt[i].id == dummyChild[a].parentId){ 
 

 
    \t \t \t \t \t dataGrand.children[j].children[k] = dummyChild[a]; 
 
    \t \t \t \t \t k++; 
 
    \t \t \t \t } 
 
    \t \t \t } 
 
    \t \t \t j++; 
 
\t \t \t } 
 
\t \t \t 
 
\t \t } 
 
\t \t 
 
\t \t console.log(dataGrand,"datagrand"); 
 

 
      var tableHTML = '<table id="location" border=\'1\'></table>'; 
 
     var trHTML = ''; 
 

 
     trHTML += '<tr><td>' + dataGrand.id + '</td></td><td></td><td></tr>'; 
 
      
 
for(var i in dataGrand.children){ 
 
    
 
    trHTML += '<tr><td></td><td>' + dataGrand.children[i].id + '</td></td><td></tr>'; 
 
    
 
    for(var j in dataGrand.children[i].children){ 
 
    
 
    trHTML += '<tr><td></td><td></td><td>' + dataGrand.children[i].children[j].id + '</td></tr>'; 
 
    
 
}; 
 
    
 
}; 
 

 
     $('body').append(tableHTML); 
 
\t 
 
$('#location').append(trHTML); 
 
\t } 
 
    init(); 
 
});
<html> 
 
    <head> 
 
     <!-- jQuery library --> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> 
 
     
 
     
 
    </head> 
 
    <body> 
 
     
 
    </body> 
 
</html>

+0

如果你达到了第3级,因为我看到你的更新代码..试图把一个更多的循环 – Varsha

+0

@Varsha我希望它排序到第n层的嵌套对象。 –

我只是写一个逻辑尝试,希望它能正常工作..

为此,您创建的id的数组,并应用此功能进行排序 该数组,然后基于这个有序的数组,你可以将 对象放入一个新的数组中,这将是所需的输出。 ID的的

1) GET数组 - _.pluck(YOURLIST, 'id');

或者如果你不想使用underscore.js然后,基于长度

var arrayOfIds = []; 
function getLeaf(YOURLIST) { 
    for (i=0; i > YOURLIST.length; i++) { 
     arrayOfIds.push(YOURLIST[i].id); 
     for (j=0; j > YOURLIST[i].length; j++) { 
      arrayOfIds.push(YOURLIST[i][j].id); 
      return getLeaf(YOURLIST[i][j]); // <- recursive call 
     } 
    } 
} 

使用循环内的循环2)调用下面的函数对上面创建的数组进行排序。

function compareAndSort(x, y) { 
    var xParts = x.split('.'); 
    var yParts = y.split('.'); 
    var max = xParts.length > yParts.length ? yParts.length : xParts.length; 
    for (int i = 0; i < max; i++) { 
     var xInt = parseInt(xParts[i]); 
     var yInt = parseInt(yParts[i]); 
     if (xInt < yInt) { 
     return -1; 
     } 
     if (yInt < xInt) { 
     return 1; 
     } 
     if (i == max -1) { 
     if (yParts.length > xParts.length) { 
      return -1; 
     } 
     } 
    } 
    return 0; 
} 

3)基于新的排序ArrayList中,基于ID的排序的名单上推你的对象创建对象的一个​​新的期望输出数组。

+0

问题是我得到的逻辑来达到子对象中的子对象。你可以在这里解释一下你的解决方案吗? –

+0

我编辑了我的答案..如果你需要进一步的帮助..让我知道。谢谢 – Varsha

+0

嗨,它工作,如果对象是在相同的层次结构,但如果你看到数据JSON的主要父对象包含对象,可以是孩子的孩子或孩子。 –