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