J'ai un tableau d'objets comme celui-ci
[{'a': {id: 4}}, {'b': {id: 3}}, {'c': {id: 2}}, {'d': {id : 5}}]
Je veux savoir avec lodash le tri des objets selon l'identifiant. Je m'attendrais à recevoir quelque chose comme [«d», «a», «b», «c»]
.
J'ai essayé de rechercher ceci mais je n'ai pas trouvé de réponse qui fonctionne avec des clés différentes dans chaque objet. J'ai essayé de faire cela avec les différentes fonctions de lodash (nombreuses). J'ai donc pensé qu'il y avait peut-être un moyen efficace et peut-être court de résoudre ce problème.
5 Réponses :
const data = [{ a: { id: 4 }}, { b: { id: 3 }}, { c: { id: 2 }}, { d: { id: 5 }}]; data.sort((a, b) => Object.values(b)[0].id - Object.values(a)[0].id); console.log(data);
L'extrait ci-dessus montre comment le faire avec Array.sort. Lodash devrait fonctionner de la même manière.
Voici une solution JavaScript simple.
Puisque vous voulez obtenir les clés triées comme résultat, cette solution ne modifie pas le tableau d'origine, grâce à la première map
avant tri
:
const data = [{ 'a': { id: 4 }}, { 'b': { id: 3 }}, { 'c': { id: 2 }}, { 'd': { id: 5 }}]; const sorted = data .sort((a, b) => Object.values(b)[0].id - Object.values(a)[0].id) .map(x => Object.keys(x)[0]); console.log(sorted);
Si vous ne vous souciez pas de muter le tableau d'origine, vous pouvez directement trier en utilisant Object.values ()
puis renvoyer la première clé avec Object.keys ( )
:
const data = [{ 'a': { id: 4 }}, { 'b': { id: 3 }}, { 'c': { id: 2 }}, { 'd': { id: 5 }}]; const sorted = data .map(x => Object.entries(x)[0]) .sort((a, b) => b[1].id - a[1].id) .map(x => x[0]); console.log(sorted);
Vous pouvez d'abord trier en fonction de l'identifiant et ensuite mapper la clé.
let obj = [{ 'a': { id: 4 }}, { 'b': { id: 3 }}, { 'c': { id: 2 }}, { 'd': { id: 5 }}] let op = obj .sort((a,b) => Object.values(b)[0].id - Object.values(a)[0].id) .map(e => Object.keys(e)[0]) console.log(op)
Vous pouvez simplement le faire avec javascript en utilisant la méthode sort
et en mappant le tableau retourné et en renvoyant les clés
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
Ou vous pouvez utiliser lodash avec les méthodes orderBy et map
var data = [{ 'a': { id: 4 }}, { 'b': { id: 3 }}, { 'c': { id: 2 }}, { 'd': { id: 5 }}] const res = _.orderBy(data, function(a) { return Object.values(a)[0].id }, ['desc']).map(o => Object.keys(o)[0]) console.log(res);
var data = [{ 'a': { id: 4 }}, { 'b': { id: 3 }}, { 'c': { id: 2 }}, { 'd': { id: 5 }}] const res = data.sort((a, b) => Object.values(b)[0].id - Object.values(a)[0].id).map(obj => Object.keys(obj)[0]); console.log(res);
C'est exactement la même solution que ce que @CodeManiac a déjà publié
@Bergi Le moment de la publication n'a pas beaucoup de différence si vous voyez et il est tout à fait possible que deux personnes travaillent simultanément sur l'extrait de code et publient la même réponse car c'est une façon très standard de le résoudre
Ceci est une version lodash / fp de La solution dejo_va .
Utilisez _.flow ()
pour créer une fonction qui mappe chaque objet à un [clé, {id}]
paire. Trier avec _.orderBy ()
en fonction de id
. Itérez avec _.map ()
et extrayez le _.head ()
(la clé):
<script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>
const { flow, flatMap, toPairs, orderBy, map, head } = _ const fn = flow( flatMap(toPairs), // convert each object to pair of [key, { id }] orderBy(['[1].id'], ['desc']), // order descending by the id map(head) // extract the original key ) const data = [{ 'a': { id: 4 }}, { 'b': { id: 3 }}, { 'c': { id: 2 }}, { 'd': { id: 5 }}] const result = fn(data) console.log(result)
Dans la première étape, transformez votre tableau en
[{key: 'a', id: 4}, {key: 'b', id: 3},…]
.