Javascript 排序对象数组,并在这些对象中添加嵌套数组

Javascript 排序对象数组,并在这些对象中添加嵌套数组,javascript,arrays,sorting,Javascript,Arrays,Sorting,更新了示例,因为它与文章中给出的对象结构不匹配 有一个数组,它有多个对象,如下所示: { text: text, elements: [ { id: id, page: pageNumber } ] } array.sort(function(a,b) { if (a.text < b.text) return -1; if (a.text > b.tex

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

有一个数组,它有多个对象,如下所示:

{ 
    text: text,
    elements: [
        { 
            id: id, 
            page: pageNumber 
        }
    ]
}
array.sort(function(a,b) {
    if (a.text < b.text) return -1;
    if (a.text > b.text) return 1;
    return 0;
});
现在,我需要以两种方式对内容进行排序:

  • 文本
    -字段对所有数组元素进行排序
  • 我想这样做:

    { 
        text: text,
        elements: [
            { 
                id: id, 
                page: pageNumber 
            }
        ]
    }
    
    array.sort(function(a,b) {
        if (a.text < b.text) return -1;
        if (a.text > b.text) return 1;
        return 0;
    });
    
    应分类为:

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

    因此对象顺序发生了变化,因为AS之前,而(现在)第二个对象中页面元素的顺序则相反。

    对于第一部分,您可以使用。并为页面数组使用另一个拆分字符串的排序函数

    var数组=[{id:1,text:'Some text',元素:[{id:1,pages:'45-67'},{id:2,pages:'12-34'},{id:4,pages:'12-5'},{id:5,pages:'12'},{id:3,text:'other text',elements:[{id:3,pages 12-34'}];
    array.sort(函数(a,b){
    返回a.text.localeCompare(b.text);
    });
    array.forEach(函数(el){
    el.元素.排序(函数(a,b){
    var aa=a.pages.split('-'),
    bb=b.pages.split('-');
    返回aa[0]-bb[0]| |(aa[1]| | 0)-(bb[1]| | 0);
    });
    });
    
    console.log(数组)有一种对元素进行排序的方法

    function transElement () {
      return parseInt(s.split('-')[0], 10);
    }
    
    elements.sort(function (a, b) {
      return transElement(b) - transElement(a);
    });
    

    这个问题并不难,因为作者已经把问题分解成了更小的部分。例如,您提到先对文本进行排序,然后对嵌套属性(pages)进行排序,这是您遇到的问题

    您的用例更简单,因为我们知道您正在处理页面,所以页码将保持一致。例如,不太可能有像“10-20”和“10-15”这样的条目,如果他们有,那么我下面的代码将不得不扩展一点来处理这种情况

    否则,我下面所做的就是使用
    -
    字符作为delimeter拆分字符串条目,以获得
    fromPage
    toPage
    参数。然后使用fromPage,我们在
    sort
    函数中进行通常的比较,以确定谁更小

    排序完成后,我对外部项目进行排序,您已经得到了解决方案

    解决方案:

    // Sort the nested properties first - in this instance it will be page
    example.forEach(item => {
      item.pages.sort(function (a, b) {
        aFromPage = a.split('-')[0];
        bFromPage = b.split('-')[0];
        // Assuming from page number is unique, if it is not unique then the ToPage number can be
        // used for comparison also.
        return (aFromPage < bFromPage) ? -1 : 1;
      })
    });
    
    // Handle the outer item
    example.sort(function(a,b) {
      if (a.text < b.text) return -1;
      if (a.text > b.text) return 1;
      return 0;
    });
    
    console.log(JSON.stringify(example));
    
    [
      {
        "id" : 3,
        "text" : "Another text",
        "pages":
            [
              "1-11",
              "12-34",
              "35-100"
            ]
      },
      {
        "id" : 1,
        "text" : "Some text",
        "pages":
            [
              "12-34",
              "35-44",
              "45-67",
              "68-100"
            ]
      }
    ]
    

    哦,我犯了个大错。我的示例结构与本文开头所示的不同。对此我很抱歉。”“元素”应该按“页面”排序,而元素是数组,页面只是一个对象字符串。我真的很抱歉。我更新了帖子。请看这个例子。“localCompare”而不是像Samuel在他的回答中那样使用“sort”有什么好处?如果先按嵌套元素排序,然后再按文本排序,会怎么样?这样你就可以按你想要的方式进行分类(尽管不是很有效)@user3142695我快速浏览了更新后的帖子,不幸的是,我再也无法通过手机访问我的公司了。我的示例代码应该仍然有效。祝你好运,让我知道你的进展如何,我会尽力帮助你。