[英]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.