Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/458.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在数组中,如何使用.sort()根据一个属性对另一个属性排序的对象进行分组?_Javascript_Arrays_Sorting - Fatal编程技术网

Javascript 在数组中,如何使用.sort()根据一个属性对另一个属性排序的对象进行分组?

Javascript 在数组中,如何使用.sort()根据一个属性对另一个属性排序的对象进行分组?,javascript,arrays,sorting,Javascript,Arrays,Sorting,使用Javascripts.sort,我有一个具有“category”属性和“subcategory”属性的对象列表。到目前为止,我使用item1.category.localeCompareitem2.category按类别对列表进行排序,但在每个类别组中,我希望按子类别对对象进行排序 到目前为止,我的数组排序如下: [ {'category':'cat1', 'subcategory':'subcat1'}, {'category':'cat1', 'subcategory':'su

使用Javascripts.sort,我有一个具有“category”属性和“subcategory”属性的对象列表。到目前为止,我使用item1.category.localeCompareitem2.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'}
]
而我需要它是这样的:

[
  {'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'}
]

此外,我只能使用一个排序,并且不能在它之外执行任何操作,因为它将作为参数传递给另一个函数。

只需扩展排序函数即可

 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;
     }
   }
 });

查看此处的工作小提琴:

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

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

只需向排序函数添加一个附加谓词:

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"}]
试试这个:

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;
}));
这对我很有用:

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;
});

它检查类别是否不同。如果它是不同的,那么它将按此排序。否则,如果类别相同,则按子类别进行排序。

a.category.localeCompareb.category | | a.subcategory.localeCompareb.subcategory这将同等对待类别和子类别。它应该只在类别相等时比较子类别。这是非常正确的,用| | XD替换+即可