按两个值对其中包含 JS 对象的数组进行排序
Sort an array with JS objects in it by two values
我有一个数组,里面大约有 50 个 JS 对象,数组中的每个对象都有一个名称,catname,dish_sort_id 和 sort_id
目前我正在尝试对它进行排序,以便在数组中通过 catname 和 if dish_sort_id < then 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;
}
});
您的回调违反了约定:如果您正在比较的两个对象 catname
相同,它不会 return 任何东西。除了违反合同之外,这也是它无法正常工作的原因。
这是多键排序的标准情况,您先按第一个键,然后按第二个键,依此类推。例如,按猫名(升序)排序,在猫名中,按 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>
我有一个数组,里面大约有 50 个 JS 对象,数组中的每个对象都有一个名称,catname,dish_sort_id 和 sort_id
目前我正在尝试对它进行排序,以便在数组中通过 catname 和 if dish_sort_id < then 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;
}
});
您的回调违反了约定:如果您正在比较的两个对象 catname
相同,它不会 return 任何东西。除了违反合同之外,这也是它无法正常工作的原因。
这是多键排序的标准情况,您先按第一个键,然后按第二个键,依此类推。例如,按猫名(升序)排序,在猫名中,按 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>