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

时间:2016-12-07 14:11:45

标签: jquery json sorting

嘿,我正试图对这个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应该以树格式排序。如果object的parentid与另一个对象的id匹配,那么对象将在object下面,等等到第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() {
	
	 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"
        }  
    ]
}`);

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

	 var dataGrand= json;
	 
	 var data=[];

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

		 var k,j=0;

		 
		 for(var i in dummyParnt){

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

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


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

    					 dataGrand.children[j].children[k] = dummyChild[a];
    					 k++;
    				 }
    			 }
    			 j++;
			 }
			 
		 }
		 
		 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);
	 
$('#location').append(trHTML);
	 }
     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>

1 个答案:

答案 0 :(得分:0)

我只是写一个逻辑尝试它希望它按预期工作..

  

为此,您创建一个id数组并应用此函数进行排序   那个数组然后基于你可以推送的这个排序的id数组   将对象转换为新数组,这将是所需的输出。

1)获取ID的数组 - _.pluck(YOURLIST, 'id');

如果您不想使用underscore.js,则根据长度使用for循环for循环

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的排序列表推送对象,创建一个新的所需对象输出数组。