将指定排序条件的对象数组排序为字符串

Alb*_*orz 6 javascript arrays sorting

我希望有一个函数来通过获取包含属性名称和排序方向的字符串作为输入来对对象数组进行排序.我需要这样的东西:

var myArray = [{name:"A", age: 30}, {name:"B", age:20}, {name:"C", age:20}];

var strSort = "age asc, name desc";

var sortedArray = customSortFuntion(myArray,strSort);
//sortedArray == [{name:"C", age:20}, {name:"B", age:20},{name:"A", age: 30}]

function customSortFuntion(myArray,strSort)
{
 //return sorted by age asc and sorted by name desc etc..??
}
Run Code Online (Sandbox Code Playgroud)

Pas*_*rby 2

该解决方案需要Array.prototype.map(“shim”-able)来呈现:

function customSortFunction(myArray,strSort){
    var sorts=strSort.split(",").map(function(v,i){
        var o=v.match(/\s(asc|desc)$/i);
        if(o){
            return {"prop":v.replace(/\s(asc|desc)$/i,"").replace(/^\s+|\s+$/,""),"order":o[1].toLowerCase()};
        }else{
            return {"prop":v,"order":"asc"};
        }
    });
    myArray.sort(function(a,b){
        var av,bv;
        for(var i=0;i<sorts.length;i++){
            av=a[sorts[i]["prop"]] || 0;
            bv=b[sorts[i]["prop"]] || 0;
            if(sorts[i]["order"]=="asc"){
                if(av>bv){
                    return 1;
                }else if(bv>av){
                    return -1;
                }
            }else{
                if(av>bv){
                    return -1;
                }else if(bv>av){
                    return 1;
                }
            }
        }
        return 0;
    });
    return myArray;
}
Run Code Online (Sandbox Code Playgroud)

在线演示

给定这个数组:

[
    {name:"Z", age: 6}, 
    {name:"Z", age: 19}, 
    {name:"A", age: 30}, 
    {name:"B", age: 20}, 
    {name:"C", age: 20}, 
    {name:"A", age: 31}
]
Run Code Online (Sandbox Code Playgroud)

和排序顺序name asc, age desc

给出这个输出:

[ { name: 'A', age: 31 },
  { name: 'A', age: 30 },
  { name: 'B', age: 20 },
  { name: 'C', age: 20 },
  { name: 'Z', age: 19 },
  { name: 'Z', age: 6 } ]
Run Code Online (Sandbox Code Playgroud)