javascript - 对象数组的复合排序(排序)

标签 javascript arrays sorting

<分区>

我有一组设计相似的对象,如下所列。我想首先按 ClassName(按字母顺序)对这个数组进行排序,然后按 StartDate,但我想保留初始排序。我知道我可能可以使用 sort() 来完成此操作,但我不确定如何保留初始排序而不将原始数组分成更小的分组。

var objArray = [
    {
        ClassName: "Excel",
        Location: "Kansas City",
        StartDate: "2/1/2016",
        EndDate: "6/2/2016,"
    },
    {
        ClassName: "Outlook",
        Location: "Kansas City",
        StartDate: "1/1/2016",
        EndDate: "5/2/2016,"
    },
    {
        ClassName: "Excel",
        Location: "Kansas City",
        StartDate: "3/1/2016",
        EndDate: "7/2/2016,"
    }
];

理想情况下,根据上面的数据,我最终会得到这样的结果:

var objArray = [
    {
        ClassName: "Excel",
        Location: "Kansas City",
        StartDate: "2/1/2016",
        EndDate: "6/2/2016,"
    },
    {
        ClassName: "Excel",
        Location: "Kansas City",
        StartDate: "3/1/2016",
        EndDate: "7/2/2016,"
    },
    {
        ClassName: "Outlook",
        Location: "Kansas City",
        StartDate: "1/1/2016",
        EndDate: "5/2/2016,"
    }
];

再一次为了清楚起见,如果有多个类,最终排序最终会看起来像这样。

Excel (1/1/2016)
Excel (1/2/2016)
Excel (2/3/2016)
Outlook (1/3/2016)
Outlook (2/3/2016)
Word (1/1/2016)
Word (5/5/2016)

最佳答案

@emed 指向可能重复的链接,有一个有趣的解决方案。

我唯一的问题是性能,因为他在比较函数中不断地进行 map 和 reduce。

所以我做了一个稍微修改的版本,我还保留了反向排序的能力。

var objArray = [
    {
        ClassName: "Excel",
        Location: "Kansas City",
        StartDate: "2/1/2016",
        EndDate: "6/2/2016,"
    },
    {
        ClassName: "Outlook",
        Location: "Kansas City",
        StartDate: "1/1/2016",
        EndDate: "5/2/2016,"
    },
    {
        ClassName: "Excel",
        Location: "Kansas City",
        StartDate: "3/1/2016",
        EndDate: "7/2/2016,"
    }
];

objArray.sort(fieldSorter(['ClassName', 'StartDate']));
console.log(objArray);

function fieldSorter(fields) {
    var maps = [];
    fields.map(function (o) {
       var dir = +1;
       if (o[0] === '-') {
          dir = -1;
          o=o.substring(1);
       }
       maps.push({fn:o, dir:dir});
    });
    return function (a, b) {
       var ret = 0;
       maps.some(function (o) {
         if (a[o.fn] > b[o.fn]) ret = o.dir;
         else if (a[o.fn] < b[o.fn]) ret = -o.dir;
         else ret = 0;
         return ret !== 0;
       });
       return ret;
    };
}

关于javascript - 对象数组的复合排序(排序),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40000721/

相关文章:

python - 为什么我的函数会覆盖作为参数传递的列表?

python - 更改行顺序 Pandas 数据框

javascript - Angular2中无法从动态url获取参数

javascript - 如何使用 JavaScript 从字节加载 PublicKey RSA

php - 在数组中的每个对象上调用函数的最佳方法?没有for循环?

java - 如何在android中解析简单的JSON数组?

javascript - 删除 Fabric.js 中选定的对象矩形

来自其他输入的 Javascript 调用值

java - 如何停止模型类中的自动排序字段?

jQuery UI 可对巨型列表进行排序并保存在数据库中