Javascript按两个数字字段对数组进行排序

IT技术 javascript arrays
2021-02-04 06:51:26
grouperArray.sort(function (a, b) {
    var aSize = a.gsize;
    var bSize = b.gsize;
    var aLow = a.glow;
    var bLow = b.glow;
    console.log(aLow + " | " + bLow);      
    return (aSize < bSize) ? -1 : (aSize > bSize) ? 1 : 0;
});

所以上面的代码按 gsize 对数组进行排序 - 从最小到最大。它运行良好,但如果 gsize 相同,我希望它按发光排序。

谢谢。

6个回答
grouperArray.sort(function (a, b) {   
    return a.gsize - b.gsize || a.glow - b.glow;
});

较短的版本

你能解释一下这里的逻辑吗?!。它对我有用sort an array with a key's value first,然后sort the result with another key's value
2021-03-16 06:51:26
很棒的捷径!帮我把更复杂的解决方案放在一起.. stackoverflow.com/questions/6101475/...
2021-03-27 06:51:26
漂亮干净!它唯一只适用于数字。
2021-03-31 06:51:26
@Scalpweb 是的 :) 所以这可以用任意数量的键对数组进行一一排序,对吗?!不错的把戏
2021-04-10 06:51:26
@KTM 逻辑是这样的:如果两个gsize相等,则条件的第一部分等于0,认为是假的,然后执行条件的第二部分。
2021-04-12 06:51:26
grouperArray.sort(function (a, b) {
    var aSize = a.gsize;
    var bSize = b.gsize;
    var aLow = a.glow;
    var bLow = b.glow;
    console.log(aLow + " | " + bLow);

    if(aSize == bSize)
    {
        return (aLow < bLow) ? -1 : (aLow > bLow) ? 1 : 0;
    }
    else
    {
        return (aSize < bSize) ? -1 : 1;
    }
});
简单有效
2021-03-24 06:51:26
要使用箭头语法,而不是诉诸于一些其他的答案显示不明显的技术使这个更简洁:grouperArray.sort((a, b) => a.gsize == b.gsize ? a.glow - b.glow : a.gsize - b.gsize为了使代码更容易理解,我们对==.
2021-03-26 06:51:26
天哪……谢谢@ToolmakerSteve。
2021-04-07 06:51:26
grouperArray.sort((a, b) => a.gsize - b.gsize || a.glow - b.glow);

使用箭头语法的更短版本!

最简洁可扩展,完美!
2021-03-25 06:51:26
如果你想了解为什么会这样,你可能想看看 medium.com/@safareli/pss-ordering-is-a-monoid-61a4029387e
2021-03-25 06:51:26
甚至更短,去掉空格: grouperArray.sort((a,b)=>a.gsize-b.gsize||a.glow-b.glow);
2021-03-30 06:51:26

我意识到这是前一段时间被问到的,但我想我会添加我的解决方案。

此函数动态生成排序方法。只需提供每个可排序的子属性名称,并在前面加上 +/- 以指示升序或降序。超级可重用,它不需要知道你放在一起的数据结构。可以证明白痴 - 但似乎没有必要。

function getSortMethod(){
    var _args = Array.prototype.slice.call(arguments);
    return function(a, b){
        for(var x in _args){
            var ax = a[_args[x].substring(1)];
            var bx = b[_args[x].substring(1)];
            var cx;

            ax = typeof ax == "string" ? ax.toLowerCase() : ax / 1;
            bx = typeof bx == "string" ? bx.toLowerCase() : bx / 1;

            if(_args[x].substring(0,1) == "-"){cx = ax; ax = bx; bx = cx;}
            if(ax != bx){return ax < bx ? -1 : 1;}
        }
    }
}

用法示例:

items.sort(getSortMethod('-price', '+priority', '+name'));

这将首先items以最低的方式排序price,关系将指向具有最高的项目priority进一步的联系被项目打破name

其中 items 是一个数组,如:

var items = [
    { name: "z - test item", price: "99.99", priority: 0, reviews: 309, rating: 2 },
    { name: "z - test item", price: "1.99", priority: 0, reviews: 11, rating: 0.5 },
    { name: "y - test item", price: "99.99", priority: 1, reviews: 99, rating: 1 },
    { name: "y - test item", price: "0", priority: 1, reviews: 394, rating: 3.5 },
    { name: "x - test item", price: "0", priority: 2, reviews: 249, rating: 0.5 } ...
];

现场演示:http : //gregtaff.com/misc/multi_field_sort/

编辑:修复了 Chrome 的问题。

对于typescript(没有得到error TS2554: Expected 0 arguments, but got ..)使用这里的语法:stackoverflow.com/a/4116634/5287221
2021-03-23 06:51:26
天才回答!
2021-04-01 06:51:26
这太棒了
2021-04-13 06:51:26

我希望三元运算符((aSize < bSize) ? -1 : (aSize > bSize) ? 1 : 0;)让您感到困惑。您应该查看链接以更好地理解它。

在那之前,这里是你的 if/else 代码。

grouperArray.sort(function (a, b) {
    if (a.gsize < b.gsize)
    {
        return -1;
    }
    else if (a.gsize > b.gsize)
    {
        return 1;
    }
    else
    {
        if (a.glow < b.glow)
        {
            return -1;
        }
        else if (a.glow > b.glow)
        {
            return 1;
        }
        return 0;
    }
});