Javascript : tri d'un objet par objet enfant en fonction de la valeur de la clé


Devon Dahon

Comment trier un objet par une valeur donnée de ses clés enfants ?

Par exemple, cet objet :

{
    "a": {
        "name": "Edward",
        "value": 21
    },
    "b": {
        "name": "Sharpe",
        "value": 37
    },
    "c": {
        "name": "And",
        "value": 45
    },
    "d": {
        "name": "The",
        "value": -12
    },
    "e": {
        "name": "Magnetic",
        "value": 13
    },
    "f": {
        "name": "Zeros",
        "value": 37
    }
}

deviendrait trié par la clé "value" de ses objets enfants :

{
    "d": {
        "name": "The",
        "value": -12
    },
    "e": {
        "name": "Magnetic",
        "value": 13
    },
    "a": {
        "name": "Edward",
        "value": 21
    },
    "b": {
        "name": "Sharpe",
        "value": 37
    },
    "f": {
        "name": "Zeros",
        "value": 37
    },
    "c": {
        "name": "And",
        "value": 45
    }
}
Bravo

Cela marche

var obj = {
    "a": {
        "name": "Edward",
        "value": 21
    },
    "b": {
        "name": "Sharpe",
        "value": 37
    },
    "c": {
        "name": "And",
        "value": 45
    },
    "d": {
        "name": "The",
        "value": -12
    },
    "e": {
        "name": "Magnetic",
        "value": 13
    },
    "f": {
        "name": "Zeros",
        "value": 37
    }
};

const result = Object.fromEntries(Object.entries(obj).sort(([,{value:a}],[,{value:b}])=>a-b));
console.log(result);
console.log(Object.keys(result).join());

mais bien que cela semble fonctionner, l'ordre des propriétés des objets n'est pas strictement défini, alors qui peut dire que cela fonctionnera toujours

par exemple, si certaines des touches de niveau supérieur sont numériques, voici le résultat

var obj = {
    "a": {
        "name": "Edward",
        "value": 21
    },
    "b": {
        "name": "Sharpe",
        "value": 37
    },
    "1": {
        "name": "And",
        "value": 45
    },
    "d": {
        "name": "The",
        "value": -12
    },
    "2": {
        "name": "Magnetic",
        "value": 13
    },
    "f": {
        "name": "Zeros",
        "value": 37
    }
};

const result = Object.fromEntries(Object.entries(obj).sort(([,{value:a}],[,{value:b}])=>a-b));
console.log(result);
console.log(Object.keys(result).join()); // want d2abf1 - get 12dabf

c'est parce que les clés numériques précèdent TOUJOURS les non-numériques, quel que soit l'ordre de création - c'est une chose qui EST définie à propos de l'ordre des propriétés de l'objet

Articles connexes