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

时间:2016-07-13 12:00:17

标签: javascript arrays sorting

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

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

{ 
    text: text,
    elements: [
        { 
            id: id, 
            page: pageNumber 
        }
    ]
}

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

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

    我会这样做:

    array.sort(function(a,b) {
        if (a.text < b.text) return -1;
        if (a.text > b.text) return 1;
        return 0;
    });
    
    1. 嵌套elements - 数组的内容也应按page - 字段排序。
    2. 我不知道如何对一个嵌套在对象中的数组进行排序......不幸的是,由于元素是字符串,它会变得更加困难,但代表了一些页码。那么如何以正确的方式对这些数据进行排序,因为元素看起来像12323-34?在123-12523-34的情况下,最后一个元素应该是第一个元素。

      示例

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

      应排序为:

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

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

3 个答案:

答案 0 :(得分:3)

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

#ruby

答案 1 :(得分:1)

问题并不困难,因为作者已经将问题分解为更小的问题。例如 - 你提到先对文本进行排序,然后再对你遇到问题的嵌套属性(页面)进行排序。

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

否则我在下面所做的就是使用-字符作为分隔符来拆分字符串条目,以获得fromPagetoPage参数。然后使用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"
        ]
  }
]

答案 2 :(得分:0)

有一种方法可以对元素进行排序。

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

elements.sort(function (a, b) {
  return transElement(b) - transElement(a);
});