简体   繁体   English

在数组中,如何使用.sort()根据一个属性将另一个属性排序的对象组合在一起?

[英]In an array, how do you group together objects based on one property that are being sorted by another, using .sort()?

Using Javascripts .sort(), I have a list of objects that have a 'category' property and a 'subcategory' property. 使用Javascript .sort(),我得到了一个具有'category'属性和'subcategory'属性的对象列表。 So far I have the list sorted by category using item1.category().localeCompare(item2.category()) but within each category group I want to have the objects sorted by subcategory. 到目前为止,我已经使用item1.category().localeCompare(item2.category())按类别对列表进行了排序,但是在每个类别组中,我希望按子类别对对象进行排序。

So far my array sorts into something like this: 到目前为止,我的数组整理成这样的东西:

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

Whereas I need it to be like this: 而我需要像这样:

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

Also I can only use one sort() and can't do anything outside of it as it's being passed as a param to another function. 另外,我只能使用一个sort(),并且无法将其作为参数传递给另一个函数,因此无法做任何事情。

Just add an additional predicate to your sort function: 只需在您的sort函数中添加一个附加谓词即可:

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"}]

You could add another localeCompare on the subcategory, eg: 您可以在子类别上添加另一个localeCompare,例如:

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

Just expand your sorting function. 只需扩展您的排序功能即可。

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

Look at the working fiddle here: http://jsfiddle.net/Sergey_Mell/htv6zs8g/ 在这里查看工作的小提琴: http : //jsfiddle.net/Sergey_Mell/htv6zs8g/

try this: 尝试这个:

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

This works for me: 这对我有用:

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

It checks to see if category is different. 它检查类别是否不同。 If it is different, then it sorts by that. 如果不同,则按此排序。 Else (if category is the same), it sorts by subcategory . 否则(如果类别相同),则按子类别进行排序。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何根据另一个数组的排序方式对一个数组进行排序? (JavaScript)的 - How to sort one array based on how another gets sorted? (Javascript) 在对象数组中,如果对象值共享另一个键,如何将它们分组? - Inside an array of objects, how do you group object values if they share another key together? 如何在React Redux应用程序中基于一个属性对数组排序然后再对另一个属性进行分组 - How to sort an array based on one property and then group by another property in React Redux application 如何基于另一个对象数组对一个对象数组进行排序 - How do I sort an array of objects based on another array of objects 如何根据另一个数组的顺序对对象数组进行排序? - How do I sort an array of objects based on the ordering of another array? 如何基于另一个数组中的键/值对为一个数组中的对象分配属性值? - How do I assign property values for objects in one array based on key/value pairs in another? 如何根据布尔属性对对象数组进行排序? - How to sort array of objects based on a boolean property? 根据另一个参考ID数组按属性对对象数组进行排序 - Sort an array of objects by property based on another array of reference IDs 如何根据另一个对象对数组进行排序? - How to sort an array of objects based on another? 如何正确排序对象数组? - How do you sort an array of objects properly?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM