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 に答える