【问题标题】:In an array, how do you group together objects based on one property that are being sorted by another, using .sort()?在一个数组中,如何使用 .sort() 将基于一个属性由另一个属性排序的对象组合在一起?
【发布时间】:2017-08-13 12:11:08
【问题描述】:

使用 Javascripts .sort(),我有一个具有“类别”属性和“子类别”属性的对象列表。到目前为止,我使用item1.category().localeCompare(item2.category()) 按类别对列表进行了排序,但在每个类别组中,我希望对象按子类别排序。

到目前为止,我的数组排序如下:

[
  {'category':'cat1', 'subcategory':'subcat1'},
  {'category':'cat1', 'subcategory':'subcat2'},
  {'category':'cat1', 'subcategory':'subcat1'},
  {'category':'cat1', 'subcategory':'subcat2'},
  {'category':'cat1', 'subcategory':'subcat2'},
  {'category':'cat1', 'subcategory':'subcat1'},
  {'category':'cat1', 'subcategory':'subcat2'},
  {'category':'cat2', 'subcategory':'subcat1'},
  {'category':'cat2', 'subcategory':'subcat2'},
  {'category':'cat2', 'subcategory':'subcat1'},
  {'category':'cat2', 'subcategory':'subcat2'},
  {'category':'cat2', 'subcategory':'subcat2'},
  {'category':'cat2', 'subcategory':'subcat1'},
  {'category':'cat2', 'subcategory':'subcat2'}
]

而我需要它是这样的:

[
  {'category':'cat1', 'subcategory':'subcat1'},
  {'category':'cat1', 'subcategory':'subcat1'},
  {'category':'cat1', 'subcategory':'subcat1'},
  {'category':'cat1', 'subcategory':'subcat2'},
  {'category':'cat1', 'subcategory':'subcat2'},
  {'category':'cat1', 'subcategory':'subcat2'},
  {'category':'cat1', 'subcategory':'subcat2'},
  {'category':'cat2', 'subcategory':'subcat1'},
  {'category':'cat2', 'subcategory':'subcat1'},
  {'category':'cat2', 'subcategory':'subcat1'},
  {'category':'cat2', 'subcategory':'subcat2'},
  {'category':'cat2', 'subcategory':'subcat2'},
  {'category':'cat2', 'subcategory':'subcat2'},
  {'category':'cat2', 'subcategory':'subcat2'}
]

另外我只能使用一个 sort() 并且不能在它之外做任何事情,因为它被作为参数传递给另一个函数。

【问题讨论】:

  • a.category.localeCompare(b.category) || a.subcategory.localeCompare(b.subcategory)

标签: javascript arrays sorting


【解决方案1】:

只需在排序函数中添加一个额外的谓词:

const arr = [ 
  { "field1": "a2", "field2": "b2" },  
  { "field1": "a1", "field2": "b2" },
  { "field1": "a1", "field2": "b1" }
];

arr.sort((a,b) => {
  return a.field1.localeCompare(b.field1) || a.field2.localeCompare(b.field2);
});
// [ {"field1":"a1","field2":"b1"},
//   {"field1":"a1","field2":"b2"},
//   {"field1":"a2","field2":"b2"}]

【讨论】:

    【解决方案2】:

    您可以在子类别中添加另一个 localeCompare,例如:

    arr.sort(function (a,b) {
        return a.category.localeCompare(b.category)
            || a.subcategory.localeCompare(b.subcategory);
    })
    

    【讨论】:

    • 这将平等对待类别和子类别。它应该只在类别相等时比较子类别。
    • 说的很对,把+换成||XD
    【解决方案3】:

    只需扩展您的排序功能。

     categories.sort(function(a, b) {
       if(a.category < b.category){
         return -1;  
       }else if(a.category > b.category){
         return 1;
       }else{
         if(a.subcategory < b.subcategory){
           return -1
         }else if(a.subcategory > b.subcategory){
           return 1;
         }
       }
     });
    

    看看这里的工作小提琴:http://jsfiddle.net/Sergey_Mell/htv6zs8g/

    【讨论】:

      【解决方案4】:

      试试这个:

      var values = [
        {'category':'cat1', 'subcategory':'subcat1'},
        {'category':'cat1', 'subcategory':'subcat2'},
        {'category':'cat1', 'subcategory':'subcat1'},
        {'category':'cat1', 'subcategory':'subcat2'},
        {'category':'cat1', 'subcategory':'subcat2'},
        {'category':'cat1', 'subcategory':'subcat1'},
        {'category':'cat1', 'subcategory':'subcat2'},
        {'category':'cat2', 'subcategory':'subcat1'},
        {'category':'cat2', 'subcategory':'subcat2'},
        {'category':'cat2', 'subcategory':'subcat1'},
        {'category':'cat2', 'subcategory':'subcat2'},
        {'category':'cat2', 'subcategory':'subcat2'},
        {'category':'cat2', 'subcategory':'subcat1'},
        {'category':'cat2', 'subcategory':'subcat2'}
      ];
      console.log(values.sort(function (a, b) {
        var tmp_a = a.category + a.subcategory;
        var tmp_b = b.category + b.subcategory;
      
        if (tmp_a < tmp_b) {
          return -1;
        }
        if (tmp_a > tmp_b) {
          return 1;
        }
        // a must be equal to b
        return 0;
      }));
      

      【讨论】:

        【解决方案5】:

        这对我有用:

        arr.sort(function(a, b) {
            if (a.category != b.category) {
                return (a.category > b.category) ? 1 : -1;
            } else {
                return (a.subcategory > b.subcategory) ? 1 : -1;
            }
            return 0;
        });
        

        它检查 category 是否不同。如果不同,则按此排序。否则(如果 category 相同),则按 subcategory 排序。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-07-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多