我有一个大约有50个JS对象的数组,数组中的每个对象都有一个名称,catname,dish_sort_id和sort_id
目前我正在尝试对它进行排序,以便在数组中它通过catname进行组对象,如果是dish_sort_id<然后是下一个对象的dish_sort_id。下面是我用来对数组进行排序的代码
尽管使用此代码,但某些项目的顺序错误,但它们正在排序
A.sort(function(a,b){
if(a.catname == b.catname && a.dish_sort_id > b.dish_sort_id){
return -1;
} else if(a.catname == b.catname && a.dish_sort_id < b.dish_sort_id){
return 1;
} else if(a.catname == b.catname && a.dish_sort_id == b.dish_sort_id){
return 0;
}
});
答案 0 :(得分:4)
您的回调违反了合同:如果您要比较的两个对象上的catname
相同,则不会返回任何内容。与打破合同分开,这也是它无法正常工作的原因。
这是多键排序的标准情况,您可以通过第一个键,然后是第二个键等进行排序。例如,按catname(升序)排序,并在catnames中按dish_sort_id排序(降序,因为这似乎是你的代码所做的事情):
A.sort(function(a,b){
var rv = a.catname.localeCompare(b.catname);
if (rv == 0) {
// Same name, use the dish_sort_id
rv = b.dish_sort_id - a.dish_sort_id;
}
return rv;
});
直播示例:
var name1 = randomName();
var name2 = randomName();
var A = [
{ catname: name2, dish_sort_id: randomNumber() },
{ catname: name1, dish_sort_id: randomNumber() },
{ catname: name1, dish_sort_id: randomNumber() },
{ catname: name2, dish_sort_id: randomNumber() },
{ catname: name2, dish_sort_id: randomNumber() },
{ catname: name1, dish_sort_id: randomNumber() }
];
show("Before", A);
A.sort(function(a,b){
var rv = a.catname.localeCompare(b.catname);
if (rv == 0) {
// Same name, use the dish_sort_id
rv = b.dish_sort_id - a.dish_sort_id;
}
return rv;
});
snippet.log("----");
show("After", A);
function show(label, a) {
snippet.log(label + ":");
A.forEach(function(entry) {
snippet.log(entry.catname + " - " + entry.dish_sort_id);
});
}
function randomName() {
var rv = "";
while (rv.length < 5) {
rv += String.fromCharCode(65 + Math.floor(Math.random() * 26));
}
return rv;
}
function randomNumber() {
return Math.floor(Math.random() * 10);
}
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>