对象数组以及这些对象中的嵌套数组进行排序

use*_*695 5 javascript arrays sorting

更新的示例,因为它与帖子中给出的对象结构不匹配

有一个数组,有多个这样的对象:

{ 
    text: text,
    elements: [
        { 
            id: id, 
            page: pageNumber 
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

现在我需要以两种方式对内容进行排序:

  1. text字段对所有数组元素进行排序

我想这样做:

array.sort(function(a,b) {
    if (a.text < b.text) return -1;
    if (a.text > b.text) return 1;
    return 0;
});
Run Code Online (Sandbox Code Playgroud)
  1. 嵌套elements-array 的内容也应按page-field 排序.

我不知道如何对一个嵌套在对象中的数组进行排序......不幸的是,由于元素是字符串,它会变得更加困难,但代表了一些页码.所以,我怎么能以正确的方式将这些数据进行排序,为元素可能看起来123还是23-34?在这种情况下123-125,23-34最后一个元素应该是第一个.

[
    {   
        text: 'Some text',
        elements: [
            { id: 1, pages: '45-67' },
            { id: 2, pages: '12-34' }
        ]

    },
    {
        text: 'Another text',
        elements: [
            { id: 3, pages: '12-34' }
        ]
    }
]
Run Code Online (Sandbox Code Playgroud)

应分类到:

[
    {
        text: 'Another text',
        elements: [
            { id: 3, pages: '12-34' }
        ]
    },
    {   
        text: 'Some text',
        elements: [
            { id: 2, pages: '12-34' },
            { id: 1, pages: '45-67' }
        ]

    },
]
Run Code Online (Sandbox Code Playgroud)

所以对象顺序已经改变,因为AS之前,并且(现在)第二个对象中的页面元素的顺序是相反的顺序.

Nin*_*olz 3

对于第一部分,您可以使用String#localeCompare. 并对页面数组使用另一个排序函数来分割字符串。

var array = [{ id: 1, text: 'Some text', elements: [{ id: 1, pages: '45-67' }, { id: 2, pages: '12-34' }, { id: 4, pages: '12-5' }, { id: 5, pages: '12' }] }, { id: 3, text: 'Another text', elements: [{ id: 3, pages: '12-34' }] }];

array.sort(function (a, b) {
    return a.text.localeCompare(b.text);
});

array.forEach(function (el) {
    el.elements.sort(function (a, b) {
        var aa = a.pages.split('-'),
            bb = b.pages.split('-');
        return aa[0] - bb[0] || (aa[1] || 0) - (bb[1] || 0);
    });
});
    
console.log(array);
Run Code Online (Sandbox Code Playgroud)