AngularJS:按父顺序重新排序数组

时间:2016-01-26 18:33:32

标签: javascript angularjs

我必须对数组进行排序,将父项放在第一位并跟随他们的孩子:

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},
]

非常感谢您的帮助

2 个答案:

答案 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);