【问题标题】:Javascript - Group by one property, sort by anotherJavascript - 按一个属性分组,按另一个排序
【发布时间】:2015-03-28 23:18:25
【问题描述】:

我有一个对象数组,目前我将它们按一个属性(一个数字)排序。我有一个排序按钮,允许用户按另一个属性(字符串)对它们进行排序。如何按 特定 值对它们进行排序,并按 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 都保持相同的顺序。

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

感谢您的帮助!

【问题讨论】:

标签: javascript arrays sorting


【解决方案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;
});

【讨论】:

  • 从技术上讲,您只需检查a.color。如果您只关心“红色”,b 无关紧要。 return a.color == 'Red' ? -1 : 1;
【解决方案2】:

听起来您正在尝试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/上的演示

【讨论】:

  • 谢谢!这是完美的。
猜你喜欢
  • 1970-01-01
  • 2011-01-25
  • 1970-01-01
  • 2018-11-19
  • 1970-01-01
  • 1970-01-01
  • 2019-03-23
  • 1970-01-01
  • 2016-07-03
相关资源
最近更新 更多