Javascript - 按一个属性分组,按另一个属性排序

时间:2015-03-28 23:18:25

标签: javascript arrays sorting

我有一个对象数组,我目前按一个属性(数字)排序。我有一个排序按钮,允许用户按另一个属性(字符串)对它们进行排序。如何通过特定的值对它们进行排序,并将它们按照javascript中的数字排序顺序排列?

一个简单的例子,使用名字,年龄和喜欢的颜色的人:

Steve, 27, Blue
Joe, 28, Red
John, 30, Green
Jane, 33, Blue
Julie, 35, Blue
Kevin, 40, Red

因此,如果用户想要使用喜欢的红色颜色的人对列表进行排序,我希望它显示如下:

Joe, 28, Red
Kevin, 40, Red
Steve, 27, Blue
Jane, 33, Blue
Julie, 35, Blue
John, 30, Green

在所选属性之后属性的顺序并不重要,只要它们按年龄分组和排序即可。例如,上面的列表(按红色排序)可以让John在Kevin之后列出,只要所有Steve,Jane和Julie都保持相同的顺序。

基本上,我想分组字符串,然后按照字符对数字进行排序。

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

Javascript的.sort()函数将函数作为可用于执行任意排序的参数。

可以完成所需排序的示例:

people.sort(function(a, b) {
    if (a.color == 'Red' && b.color != 'Red') return 1;
    if (a.color != 'Red' && b.color == 'Red') return -1;
    return 0;
});

答案 1 :(得分:0)

听起来像你正在尝试ORDER BY (color = Red), color, age(不是SQL语法):先红色,然后按颜色分组,然后按群组年龄。

在1个分拣机中这很棘手......

我认为这是一个:

function(a, b) {
    if (a.color == 'Red') {
        if (b.color == 'Red') {
            // Both Red, so check Age
            return a.age - b.age;
        }
        // A is Red, so to top
        return -1;
    }

    if (b.color == 'Red') {
        // B is red, so to top
        return 1;
    }

    if (a.color == b.color) {
        // Same color, so check Age
        return a.age - b.age;
    }

    // Different color, so check that
    return a.color < b.color ? -1 : 1;
}

结果似乎如此:

Joe     28  Red
Kevin   40  Red
Steve   27  Blue
Jane    33  Blue
Julie   35  Blue
John    30  Green

也许它可以缩短,但我再也不能思考了。

http://jsfiddle.net/rudiedirkx/83sm2squ/上的演示