使用两个值对其中包含JS对象的数组进行排序

时间:2015-04-24 10:58:16

标签: javascript arrays sorting object frontend

我有一个大约有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;
        }
    });

1 个答案:

答案 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>