Javascript按两个字段排序数组

Mar*_*ark 68 javascript arrays

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;
});
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

小智 123

grouperArray.sort(function (a, b) {   
    return a.gsize - b.gsize || a.glow - b.glow;
});
Run Code Online (Sandbox Code Playgroud)

更短的版本

  • 又漂亮又干净!唯一的事情是它只适用于数字。 (3认同)
  • @KTM 逻辑如下:如果两个 gsize 相等,则条件的第一部分等于 0,被视为 false,然后执行条件的第二部分。 (3认同)

Chr*_*rle 83

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;
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 为了使用箭头语法使其更加简洁,而不诉诸其他答案中显示的非显而易见的技术:`grouperArray.sort((a, b) =&gt; a.gsize == b.gsize ? a.glow - b.glow :a.gsize - b.gsize`。为了使代码更容易理解,我们明确地测试了`==`。 (2认同)

Vin*_*rth 18

grouperArray.sort((a, b) => a.gsize - b.gsize || a.glow - b.glow);
Run Code Online (Sandbox Code Playgroud)

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

  • 最简洁可扩展,完美! (3认同)
  • 甚至更短,去掉空格:`grouperArray.sort((a,b)=&gt;a.gsize-b.gsize ||a.glow-b.glow);` (3认同)

nih*_*ton 11

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

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

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;}
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

示例用法:

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 } ...
];
Run Code Online (Sandbox Code Playgroud)

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

编辑:修复了Chrome的问题.


Joh*_*een 6

我希望三元运算符((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;
    }
});
Run Code Online (Sandbox Code Playgroud)


The*_*urf 6

这是针对那些可能需要更通用的东西,可以在任何数量的字段中使用的人的实现。

Array.prototype.sortBy = function (propertyName, sortDirection) {

    var sortArguments = arguments;
    this.sort(function (objA, objB) {

        var result = 0;
        for (var argIndex = 0; argIndex < sortArguments.length && result === 0; argIndex += 2) {

            var propertyName = sortArguments[argIndex];
            result = (objA[propertyName] < objB[propertyName]) ? -1 : (objA[propertyName] > objB[propertyName]) ? 1 : 0;

            //Reverse if sort order is false (DESC)
            result *= !sortArguments[argIndex + 1] ? 1 : -1;
        }
        return result;
    });

}
Run Code Online (Sandbox Code Playgroud)

基本上,您可以指定任意数量的属性名称/排序方向:

var arr = [{
  LastName: "Doe",
  FirstName: "John",
  Age: 28
}, {
  LastName: "Doe",
  FirstName: "Jane",
  Age: 28
}, {
  LastName: "Foo",
  FirstName: "John",
  Age: 30
}];

arr.sortBy("LastName", true, "FirstName", true, "Age", false);
//Will return Jane Doe / John Doe / John Foo

arr.sortBy("Age", false, "LastName", true, "FirstName", false);
//Will return John Foo / John Doe / Jane Doe
Run Code Online (Sandbox Code Playgroud)