4
votes

Trier le tableau d'objets par propriété imbriquée avec lodash

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.


1 commentaires

Dans la première étape, transformez votre tableau en [{key: 'a', id: 4}, {key: 'b', id: 3},…] .


5 Réponses :


0
votes

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.


0 commentaires

4
votes

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);


0 commentaires

1
votes

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)


0 commentaires

3
votes

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);


2 commentaires

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



1
votes

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)


0 commentaires