web-dev-qa-db-fra.com

Tri d'un tableau d'objets JavaScript dans un ordre spécifique (à l'aide d'une fonction existante)

Étant donné un tableau d'objets:

 {
 touche: "a", 
 valeur: 42 
}, 
 {
 touche: "d", 
 valeur: 28 
}, 
 {
 touche: "c", 
 valeur: 92 
}, 
 {
 clé: "b", 
 valeur: 87 
} 

et un tableau de clés:

["c", "a", "b", "d"]

Existe-t-il une fonction ECMAScript ou une bibliothèque JavaScript tierce qui vous permet de trier - en un seul appel de ligne/fonction - le premier tableau d'objets, à correspond à l'ordre des clés spécifié dans le deuxième tableau, de sorte que le résultat est:

 {
 touche: "c", 
 valeur: 92 
}, 
 {
 touche: "a", 
 valeur: 42 
}, 
 {
 touche: "b", 
 valeur: 87 
}, 
 {
 clé: "d", 
 valeur: 28 
} 

Autres questions qui fournissent une fonction ou un algorithme:

Questions similaires/connexes:

25
mkopala

Utilisez simplement indexOf pour convertir la clé dans le bon ordre:

var order = ["c", "a", "b", "d"];
_.sortBy(arr, function(obj){ 
    return _.indexOf(order, obj.key);
});

Violon

S'il y a beaucoup de clés, alors il serait avantageux de faire une table de hachage à partir du tableau, comme:

var order = ["c", "a", "b", "d"];
var orderMap = {};
_.each(order, function(i) { orderMap[i] = _.indexOf(order, i); });

Cela rend la recherche de tri clé à temps constant plutôt que O (n). ( violon )

46
McGarnagle

Excellentes réponses fournies jusqu'à présent. Pensé que ce qui suit peut également être une solution alternative dans JS ordinaire:

var arr = arr.sort(function(a,b) {
    return order.indexOf( a.key ) > order.indexOf( b.key );
    //for the sake of recent versions of Google Chrome use:
    //return a.key.charCodeAt(0) > b.key.charCodeAt(0); or return a.key.charCodeAt(0) - b.key.charCodeAt(0);
});
var arr = [
    {
        key: "a",
        value: 42
    },
    {
        key: "d",
        value: 28
    },
    {
        key: "c",
        value: 92
    },
    {
        key: "b",
        value: 87
    }
];

var order = ["c", "a", "b", "d"];

console.log( 'Original: ', JSON.stringify( arr ) );

var arr = arr.sort(function(a,b) {
      return order.indexOf( a.key ) > order.indexOf( b.key );
});

console.log( 'Ordered: ', JSON.stringify( arr ) );
20
PeterKA

Je ne peux pas prétendre que c'est la manière la plus efficace , mais vous pouvez utiliser le key pour chaque objet comme clé pour les propriétés dans un autre objet. Il vous suffit ensuite d'y accéder par ces touches.

for (x = 0; x < objn.length; x++) {
    newobj[objn[x].key] = objn[x];
}
objn = [];
for (x = 0; x < keys.length; x++) {
    objn.Push(newobj[keys[x]]);
}
console.log(objn);

http://jsfiddle.net/WdehF/

2
Explosion Pills
// create hash map el.key -> index, to help us with direct access, avoid searching
const hashMap = arr.reduce((acc, el, index) => { acc[el.id] = el; return acc }, {})

// finally, map the ids to the final result
const ids.map(id => hashMap[id])
0
Josmar