将无限数量的参数传递给sort()函数

时间:2019-06-14 23:23:30

标签: javascript arrays sorting

当前的任务是创建一个函数,该函数使用不限数量的参数来对数组进行排序。

例如:

var data = [['John','London',35],
            ['Ricky','Kuala Lumpur',38],
            ['Ivan','Moscow,29]];

function arrangeOrder(a,b) {
 //Sort by field [0]
 if (a[0] > b[0]) return 1;
 if (a[0] < b[0]) return -1;

 //Sort by field [1]
 if (a[1] > b[1]) return 1;
 if (a[1] < b[1]) return -1;

 //Sort by field [2]
 if (a[2] > b[2]) return 1;
 if (a[2] < b[2]) return -1;
}

data.sort(arrangeOrder);

完美运行!但是,data的内容和字段数以及需要对数据进行排序的字段和字段数都可以更改。所以我需要能够以这种方式指定功能:

data.sort(arrangeOrder(1,3,6,9,2));

我找到了添加一个参数的方法:

function propComparator(prop) {
  return function(a,b){
    return a[prop] - b[prop];
  }
}
data.sort(propComparator(prop));

以及使用井arguments对象处理函数的参数数目不确定的方式:

function foo() {
  for (var i = 0; i < arguments.length; i++) {
    console.log(arguments[i]);
  }
}

但是我似乎无法将这项工作组合在一起。 应该有可能,但我想我只是缺乏技巧。

注意:不幸的是,ES6解决方案在我的环境中不起作用,因此我需要普通的JavaScript! 感谢所有我能得到的帮助!

3 个答案:

答案 0 :(得分:0)

使用简单的for循环:

function arrangeOrder(a, b) {
  for (var i = 0; i < a.length; i++) {
    if (a[i] > b[i]) return 1;
    if (a[i] < b[i]) return -1;
  }
}

答案 1 :(得分:0)

如果要指定索引作为参数传入的顺序,则可以使函数读取这些参数并返回一个新函数,该函数可以传递给sort()

var data = [['Betty','London',35], 
            ['Xavier','Kuala Lumpur',38],
            ['Alan','Moscow',35]];


function sortFunc(){
    let args = arguments
    return function(a, b) {
        for (let i = 0; i < args.length; i++){
            if (a[args[i]] === b[args[i]]){
                continue
            }
            return a[args[i]] > b[args[i]] ? 1 : -1
        }
        return 0
    }
}

// Sort by age, then name, then city
let f = sortFunc(2, 0, 1)
data.sort(f)
console.log(data)

// Sort by age, then city, then name
f = sortFunc(2, 1, 0)
data.sort(f)
console.log(data)

// Also works with objects:
var data = [
    {name: "Mark", age:25, home: "Anchorage"},
    {name: "Mark", age:15, home: "New York"},
    {name: "John", age:25, home: "Aachen"},
    {name: "Alice", age:15, home: "Boston"}      
];

f = sortFunc("age", "home", "name")
data.sort(f)
console.log(data)

答案 2 :(得分:0)

  

您已经烦恼了 [我找到了添加一个参数的方法]

var data =  [['John','London',35],
            ['Ricky','Kuala Lumpur',38],
            ['Ivan','Moscow',29]];

function propComparator(prop) {
    return function(a,b){
        for (const x of prop) {
            if ( a.hasOwnProperty(prop[x]) && b.hasOwnProperty(prop[x]) ) {
                if (a[ prop[x] ] === b[ prop[x] ]) continue;
                return a[ prop[x] ] > b[ prop[x] ]?1:-1;
            } else
                continue;
        }
    }
}
var prop = [2, 0, 1, 5, 1000];
data.sort(propComparator(prop));