我正在尝试对一组对象进行排序。我不想为每个属性编写自定义排序方法。
无论如何我可以扩展内置array.sort()
方法来接受额外的参数,描述要排序的属性?例如,
array.sort(function(a, b, attr) { return a.attr - b.attr; }, 'name');
我正在尝试对一组对象进行排序。我不想为每个属性编写自定义排序方法。
无论如何我可以扩展内置array.sort()
方法来接受额外的参数,描述要排序的属性?例如,
array.sort(function(a, b, attr) { return a.attr - b.attr; }, 'name');
编写一个接受属性名称的函数生成器:
function propComparator(prop) {
return function(a, b) {
return a[prop] - b[prop];
}
}
arr.sort(propComparator('name'));
您还可以直接保存分拣机或作为参数保存供以后使用:
var compareNames = propComparator('name');
var compareFoos = propComparator('foo');
...
arr.sort(compareNames);
takesComparator(compareFoos);
针对 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)
这是你要找的吗?
function sortByProperty(array, propertyName) {
return array.sort(function (a, b) {
return a[propertyName] - b[propertyName];
});
}
var sortedByName = sortByProperty(myArray, "name");
使用原型正确比较字符串和数字
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;
});
};
例子
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
无论如何我可以扩展内置的 array.sort() 方法来接受额外的参数
以上所有答案都很好。但我想添加一些关于部分功能的信息
有关更多信息,请参阅 MDN 中的绑定和部分函数或 John Resig -部分函数
来自 MDN 的示例:
function list() {
return Array.prototype.slice.call(arguments);
}
var list1 = list(1, 2, 3); // [1, 2, 3]
// Create a function with a preset leading argument
var leadingThirtysevenList = list.bind(undefined, 37);
var list2 = leadingThirtysevenList(); // [37]
var list3 = leadingThirtysevenList(1, 2, 3); // [37, 1, 2, 3]
这是谷歌关闭的一个例子
goog.partial = function(fn, var_args) {
var args = Array.prototype.slice.call(arguments, 1);
return function() {
// Prepend the bound arguments to the current arguments.
var newArgs = Array.prototype.slice.call(arguments);
newArgs.unshift.apply(newArgs, args);
return fn.apply(this, newArgs);
};
};
使用此功能
var fn=goog.partial(numberCompare,sortField,sortDirection);
myarray.sort (fn);
var numberCompare = function (sortField,sortDirection,value1,value2){
// sort code goes here
}
如果有人需要升序,这里是 DaveNewton 的带有反向选项的解决方案
const sorton = (prop, asc=0) => {
if(!asc) return (a, b) => a[prop] == b[prop] ? 0 : a[prop] < b[prop] ? -1 : 1
else return (b, a) => a[prop] == b[prop] ? 0 : a[prop] < b[prop] ? -1 : 1
}
arr.sort(propComparator('age', 1))