Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 排序将排序条件指定为字符串的对象数组_Javascript_Arrays_Sorting - Fatal编程技术网

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

Javascript 排序将排序条件指定为字符串的对象数组,javascript,arrays,sorting,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

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

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..??
}
逻辑如下:

function myFunction()
{
var arr = [[13, 'AAA'],[48, 'BBB'],[28, 'CCC'],[38, 'DDD']];
// First column * desc
     arr = arr.sort(function(a,b) {
      return b[0] > a[0];
    });

// second column *ascc
arr = arr.sort(function(a,b) {
 return a[1] > b[1];
 });
}
var myarray=[{name:'a',age:30},{name:'b',age:20}];
var mysort=函数(数组、字符串){
对于(var i=0;i,此解决方案需要(“垫片”-能够)呈现:

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;
}
和排序顺序
名称asc,年龄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 } ]

这是我的解决方案,它是一个自定义排序函数,接受规则数组,拆分它并检查属性值

它使用括号表示法动态获取名称上的属性值:
foo['bar']

代码(尝试了一点):

函数CustomSortFunction(myArray,strSort){
var sortable=myArray;
var sortRules=strSort.split(',')
返回sortable.sort(函数(a,b){
对于(var s=0;sb[sortRules[s].split(“”)[0]]{
返回1
}
}
}
})
}
演示:

更新 可以使用正则表达式在存在更多空格的情况下进行拆分

代码:

函数CustomSortFunction(myArray,strSort){
var sortable=myArray;
var sortRules=strSort.split(',')
返回sortable.sort(函数(a,b){
对于(var s=0;sb[sortRule[0]]{
返回1
}
}
}
})
}

演示:

如果您将其转换为:

"age asc, name desc"
其中一项:

[["age", "asc"], ["name", "desc"]]
[{ key: "age", dir: "asc" }, { key: "name", dir: "desc"}]
下面是一个实用程序函数,其功能如下:

function transformSortString(sortString) {
    var sortParams = [],
        temp = sortString.match(/[^ ,]+/g),
        i;
    for (i = 0; i < temp.length; i += 2) {
        sortParams.push({
            key: temp[i],
            dir: temp[i + 1]
        });
    }
    return sortParams;
}
下面是一个演示:


Douglas Crockford对排序进行了相当深入的介绍。这个问题应该可以让你开始了解如何进行排序?以strSort为例,结果会是什么?你能扩展一点吗?我只想让CustomSortFunction对myArray进行排序。我认为这个语法对于开发人员来说非常方便。你可以在我的编辑中看到排序结果这不是我想要的。我想通过strSort。谢谢。它可以工作。但是如果strSort在属性和方向之间有更多的空间,它就会失败。可以解决吗?太好了。你的解决方案很完美。谢谢。@Alborz很高兴能帮上忙:)
function customSortFuntion(myArray, strSort) {
    var sortable = myArray;
    var sortRules = strSort.split(',')
    return sortable.sort(function (a, b) {
        for (var s = 0; s < sortRules.length; s++) {
            if (sortRules[s].split(' ')[1] == "asc") {
                if (a[sortRules[s].split(' ')[0]] < b[sortRules[s].split(' ')[0]]) {
                    return 1
                }
            } else {
                if (a[sortRules[s].split(' ')[0]] > b[sortRules[s].split(' ')[0]]) {
                    return 1
                }
            }
        }
    })
}
function customSortFuntion(myArray, strSort) {
    var sortable = myArray;
    var sortRules = strSort.split(',')
    return sortable.sort(function (a, b) {
        for (var s = 0; s < sortRules.length; s++) {
            var sortRule=sortRules[s].split(/ +/)
            if (sortRule[1] == "asc") {
                if (a[sortRule[0]] < b[sortRule[0]]) {
                    return 1
                }
            } else {
                if (a[sortRule[0]] > b[sortRule[0]]) {
                    return 1
                }
            }
        }
    })
}
"age asc, name desc"
[["age", "asc"], ["name", "desc"]]
[{ key: "age", dir: "asc" }, { key: "name", dir: "desc"}]
function transformSortString(sortString) {
    var sortParams = [],
        temp = sortString.match(/[^ ,]+/g),
        i;
    for (i = 0; i < temp.length; i += 2) {
        sortParams.push({
            key: temp[i],
            dir: temp[i + 1]
        });
    }
    return sortParams;
}
function customSortFuntion(array, sortParams) {
    array.sort(function (a, b) {
        var i;
        for (i = 0; i < sortParams.length; i++) {
            if (a[sortParams[i].key] !== b[sortParams[i].key]) {
                if (a[sortParams[i].key] < b[sortParams[i].key]) {
                    return sortParams[i].dir === "asc" ? -1 : 1;
                }
                if (a[sortParams[i].key] > b[sortParams[i].key]) {
                    return sortParams[i].dir === "asc" ? 1 : -1;
                }
            }
        }
        return 0;
    });
}
var myArray = [
    { name: "A", age: 10 }, 
    { name: "B", age: 10 }, 
    { name: "C", age: 10 }, 
];
customSortFuntion(myArray, transformSortString("age asc, name desc"));