按两个值对其中包含 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>