如何使用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>
我只是写一个逻辑尝试,希望它能正常工作..
为此,您创建的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的排序的名单上推你的对象创建对象的一个新的期望输出数组。
问题是我得到的逻辑来达到子对象中的子对象。你可以在这里解释一下你的解决方案吗? –
我编辑了我的答案..如果你需要进一步的帮助..让我知道。谢谢 – Varsha
嗨,它工作,如果对象是在相同的层次结构,但如果你看到数据JSON的主要父对象包含对象,可以是孩子的孩子或孩子。 –
如果你达到了第3级,因为我看到你的更新代码..试图把一个更多的循环 – Varsha
@Varsha我希望它排序到第n层的嵌套对象。 –