我必须对数组进行排序,将父项放在第一位并跟随他们的孩子:
P.D:我正在使用angularjs。
这些:
[
{id: 1, title: 'hello', parent: 0},
{id: 2, title: 'hello', parent: 0},
{id: 3, title: 'hello', parent: 1},
{id: 4, title: 'hello', parent: 1},
{id: 5, title: 'hello', parent: 0},
{id: 6, title: 'hello', parent: 0},
{id: 7, title: 'hello', parent: 2},
{id: 8, title: 'hello', parent: 2}
]
你一定是这样:
[
{id: 1, title: 'hello', parent: 0},
{id: 3, title: 'hello', parent: 1},
{id: 4, title: 'hello', parent: 1},
{id: 2, title: 'hello', parent: 0},
{id: 7, title: 'hello', parent: 2},
{id: 8, title: 'hello', parent: 2},
{id: 5, title: 'hello', parent: 0},
{id: 6, title: 'hello', parent: 0},
]
非常感谢您的帮助
答案 0 :(得分:0)
这不需要角度。您可以使用javascript中的.sort()功能执行此操作。
array.sort(function(a,b) {
var aString, bString;
if (a.parent==0) {
aString = ('000' + a.id).slice(-3) + '.000';
} else {
aString = ('000' + a.parent).slice(-3) + '.'
+ ('000' + a.id).slice(-3);
}
if (b.parent==0) {
bString = ('000' + b.id).slice(-3) + '.000';
} else {
bString = ('000' + b.parent).slice(-3) + '.'
+ ('000' + b.id).slice(-3);
}
if (aString==bString) return 0;
if (aString<bString) return -1;
return 1;
})
我的帖子猜测,父== 0的对象是父对象(并且没有其他父对象),所以你想按id排序。在每个父级之间,您需要父对象的父== id的所有对象。
为此,我们可以创建一个表示排序顺序的字符串。该字符串将包含零填充的父ID(或对象ID,如果它没有父项),后跟零填充的对象id(如果它没有父项,则为000)。
在这种情况下,排序值(aString)将是:'001.000','001.003','001.004','002.000',......
如上所述,它仅适用于ids&lt; 1000,只有没有孙子。如有必要,这可以推广到这些情况。
希望这有帮助。
编辑:另一种选择,如果您可以确定ID将是数字,则可能更容易理解:
array.sort(function(a,b) {
var aVal, bVal;
var m = 10000
if (a.parent==0) aVal = a.id * m;
else aVal = a.parent * m + a.id;
if (b.parent==0) bVal = b.id * m;
else bVal = b.parent * m + b.id;
return aVal-bVal;
})
答案 1 :(得分:0)
我没理解你的例子。
但我建议你分两步对JSON数组进行排序。
第1步:
将JSON转换为Object:
var arr = JSON.parse(jsonArr);
第2步:
根据您的需要对数组进行排序:
function compare(a, b) {
if (a.parent < b.parent)
return -1;
else if (a.parent > b.parent)
return 1;
else
return 0;
}
arr.sort(compare);