简体   繁体   English

按多个键对javascript数组排序

[英]Sort javascript array by multiple keys

I have an array of objects something like this 我有一个像这样的对象数组

var itemArray = [
    {
        "name": "name1",
        "flag": true,
    },
    {
        "name": "name1",
        "flag": false,
    },
    {
        "name": "name2",
        "flag": false,
    },
    {
        "name": "name3",
        "flag": true,
    }        
];

I am already sorting this by the name key using the following: 我已经使用以下名称键对它进行了排序:

var sortedItems = sortByKey(itemArray, "name");

function sortByKey(array, key) {
    return array.sort(function(a, b) {
        var x = a[key];
        var y = b[key];
        return ((x < y) ? -1 : ((x > y) ? 1 : 0));
});

How do i also sort it by the flag key alphabetically so the false flags appear before the true flags? 我还如何按标志键的字母顺序对其进行排序,以使错误标志出现在真实标志之前? (I can use a string instead of boolean on the flag property if this makes it simpler) (如果这样做更简单,则可以在flag属性上使用字符串而不是布尔值)

To clarify, what I am looking for is an array which would be returned like this for example: 为了澄清,我正在寻找的是一个数组,将返回这样的示例:

[
    { name: "name_a", flag: false },
    { name: "name_a", flag: true },
    { name: "name_b", flag: false },
    { name: "name_b", flag: true},
    { name: "name_c", flag: true},
    { name: "name_d", flag: false},
]

var sortedItems = sortByKey(itemArray, "name"); var sortedItems = sortByKey(itemArray,“ name”);

function sortByKey(array, key) {
    return array.sort(function(a, b) {
        if(a[key] == b[key]) {
          return (a['flag'] ? -1 : 1);
        } else {
          var x = a[key];
          var y = b[key];
          return x.localeCompare(y);
        }
});
var sortedItems = sortByKey(itemArray, "name");

    function sortByKey(array, key) {
        return array.sort(function(a, b) {
            if(a['flag'] == f['flag']) {
              var x = a[key];
              var y = b[key];
              return ((x < y) ? -1 : ((x > y) ? 1 : 0));
            } else {
              return (a['flag'] ? -1 : 1);
            }
    });

You could use a proper callback, sort first by flag and if equal then by name . 您可以使用适当的回调,首先按flag排序,如果相等则按name排序。

 var itemArray = [{ "name": "name1", "flag": true, }, { "name": "name1", "flag": false, }, { "name": "name2", "flag": false, }, { "name": "name3", "flag": true, }]; itemArray.sort(function (a, b) { return a.name.localeCompare(b.name) || a.flag - b.flag; }), console.log(itemArray); 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM