我有一个对象数组,我需要对自定义函数进行排序,因为我想在几个对象属性上多次这样做,我想将属性的名称传递给自定义排序函数:< / p>
function compareOnOneFixedKey(a, b) {
a = parseInt(a.oneFixedKey)
b = parseInt(b.oneFixedKey)
if (a < b) return -1
if (a > b) return 1
return 0
}
arrayOfObjects.sort(compareByThisKey)
应该变得像:
function compareOnKey(key, a, b) {
a = parseInt(a[key])
b = parseInt(b[key])
if (a < b) return -1
if (a > b) return 1
return 0
}
arrayOfObjects.sort(compareOn('myKey'))
这可以方便吗?感谢。
答案 0 :(得分:11)
您可以添加包装器:
function compareOnKey(key) {
return function(a, b) {
a = parseInt(a[key], 10);
b = parseInt(b[key], 10);
if (a < b) return -1;
if (a > b) return 1;
return 0;
};
}
arrayOfObjects.sort(compareOnKey("myKey"));
答案 1 :(得分:10)
您需要partially apply该功能,例如使用bind
:
arrayOfObjects.sort(compareOn.bind(null, 'myKey'));
或者你只是让compareOn
返回实际的排序函数,使用外部函数的参数进行参数化(如其他函数所示)。
答案 2 :(得分:4)
是的,让比较器从生成器返回,该生成器接受一个你想要的密钥
function compareByProperty(key) {
return function (a, b) {
a = parseInt(a[key], 10);
b = parseInt(b[key], 10);
if (a < b) return -1;
if (a > b) return 1;
return 0;
};
}
arrayOfObjects.sort(compareByProperty('myKey'));
compareByProperty('myKey')
返回执行比较的函数,然后将其传递到.sort
答案 3 :(得分:0)
const objArr = [{
name: 'Z',
age: 0
}, {
name: 'A',
age: 25
}, {
name: 'F',
age: 5
}]
const sortKey = {
name: 'name',
age: 'age'
}
const sortArr = (arr, key) => {
return arr.sort((a, b) => {
return a[key] < b[key] ? -1 : a[key] > b[key] ? 1 : 0
})
}
console.log("sortKey.name: ", sortArr(objArr, sortKey.name))
console.log("sortKey.age: ", sortArr(objArr, sortKey.age))