12

我有一个对象数组,我需要对自定义函数进行排序,因为我想对几个对象属性执行多次此操作,我想动态地将属性的键名传递给自定义排序函数:

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'))

这可以以方便的方式完成吗?谢谢。

4

4 回答 4

14

您可以添加一个包装器:

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"));
于 2013-01-24T00:11:18.390 回答
11

您需要部分应用该功能,例如使用bind

arrayOfObjects.sort(compareOn.bind(null, 'myKey'));

或者您只需compareOn返回实际的排序函数,使用外部函数的参数进行参数化(如其他函数所示)。

于 2013-01-24T00:15:20.760 回答
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

于 2013-01-24T00:11:25.817 回答
1

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))

于 2019-05-29T21:44:02.020 回答