有什么方法可以扩展javascript的array.sort()方法来接受另一个参数?

dan*_*ods 57 javascript

我正在尝试对一组对象进行排序.我不想为每个属性编写自定义排序方法.

无论如何我可以扩展内置array.sort()方法来接受一个额外的参数,描述要排序的属性?例如,

array.sort(function(a, b, attr) { return a.attr - b.attr; }, 'name');
Run Code Online (Sandbox Code Playgroud)

Dav*_*ton 114

编写一个接受属性名称的函数生成器:

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

arr.sort(propComparator('name'));
Run Code Online (Sandbox Code Playgroud)

您也可以保存分拣机以供以后使用,直接或作为参数:

var compareNames = propComparator('name');
var compareFoos = propComparator('foo');
...
arr.sort(compareNames);
takesComparator(compareFoos);
Run Code Online (Sandbox Code Playgroud)

针对ES6进行了更新,并使其实际上适用于不同类型.

请注意,sort就地排序,这可能是也可能不是.

const arr = [
  { name: 'John', age: 92 },
  { name: 'Dave', age: 42 },
  { name: 'Justin', age: 3 }
]

const propComparator = (propName) =>
  (a, b) => a[propName] == b[propName] ? 0 : a[propName] < b[propName] ? -1 : 1

arr.sort(propComparator('name'))
console.log("By name", arr)

arr.sort(propComparator('age'))
console.log("By age", arr)
Run Code Online (Sandbox Code Playgroud)

  • 在这里看到它.http://jsfiddle.net/mivaas19/AMukX/.很好的答案; 但我仍然想知道它是如何工作的. (2认同)
  • @ mivaas19它的工作原理是因为你可以传递函数引用,无论是直接函数,就像你在很多时候看到jQuery事件处理程序一样,或命名函数,你只需要省略括号.这是一个非常强大的工具. (2认同)

Dom*_*nic 8

这是你在找什么?

function sortByProperty(array, propertyName) {
    return array.sort(function (a, b) {
        return a[propertyName] - b[propertyName];
    });
}

var sortedByName = sortByProperty(myArray, "name");
Run Code Online (Sandbox Code Playgroud)


Jan*_*roň 5

使用原型正确比较字符串和数字

Array.prototype.sortAttr = function(attr,reverse) {
  var sorter = function(a,b) {
    var aa = a[attr];
    var bb = b[attr];
    if(aa+0==aa && bb+0==bb) return aa-bb; // numbers
    else return aa.localeCompare(bb); // strings
  }
  this.sort(function(a,b) {
    var result = sorter(a,b);
    if(reverse) result*= -1;
    return result;
  });
};
Run Code Online (Sandbox Code Playgroud)

例子

var data = [
  {name: "Josh", age: 18},
  {name: "John", age: 17},
  {name: "Bob", age: 20},
  {name: 0, age: "error"}
];

data.sortAttr("name");
// data is now sorted by name
Run Code Online (Sandbox Code Playgroud)