Comment utiliser lodash pour rechercher et renvoyer un objet depuis Array?


148

Mes objets:

[
    {
        description: 'object1', id: 1
    },
    {
        description: 'object2', id: 2
    }
    {
        description: 'object3', id: 3
    }
    {
        description: 'object4', id: 4
    }
]

Dans ma fonction ci-dessous, je passe la description pour trouver l'ID correspondant:

function pluckSavedView(action, view) {
    console.log('action: ', action);
    console.log('pluckSavedView: ', view);  // view = 'object1'

    var savedViews = retrieveSavedViews();
    console.log('savedViews: ', savedViews);

    if (action === 'delete') {
        var delete_id = _.result(_.find(savedViews, function(description) {
            return description === view;
        }), 'id');

        console.log('delete_id: ', delete_id); // should be '1', but is undefined
    }
}

J'essaie d'utiliser la méthode de recherche de lodash: https://lodash.com/docs#find

Cependant ma variable delete_idsort indéfinie.


Mise à jour pour les personnes qui vérifient cette question, Ramda est une belle bibliothèque pour faire la même chose que lodash, mais d'une manière de programmation plus fonctionnelle :) http://ramdajs.com/0.21.0/docs/


1
Je _.findne vois pas pourquoi, selon vous, passerait comme par magie une seule des propriétés au rappel. Un simple console.log(description)rappel aurait pu vous le dire.
Felix Kling

Réponses:


176

L'argument passé au callback est l'un des éléments du tableau. Les éléments de votre tableau sont des objets de la forme {description: ..., id: ...}.

var delete_id = _.result(_.find(savedViews, function(obj) {
    return obj.description === view;
}), 'id');

Encore une autre alternative aux documents auxquels vous avez lié (lodash v3):

_.find(savedViews, 'description', view);

Lodash v4:

_.find(savedViews, ['description', view]);

4
Merci! Je viens de découvrir que cela fonctionne aussi var delete_id = _.result(_.find(savedViews, { 'description': view }), 'id');10 minutes de plus ...
Leon Gaban

La deuxième solution est erronée, le prédicat doit être un tableau pour utiliser le raccourci matchesProperty: il devrait être_.find(savedViews, ['description', view])
franksands

1
@FranciscoGuimaraes: Eh bien, en 2015, c'est comme ça que lodash fonctionnait: lodash.com/docs/3.10.1#find
Felix Kling

1
@FelixKling Je soupçonnais que cela pourrait être quelque chose comme ça, mais j'ai pensé qu'il valait mieux ajouter un commentaire pour les personnes (comme moi) à la recherche d'une réponse en 2018. Merci pour la mise à jour dans la réponse
franksands


29

Vous pouvez le faire facilement dans vanilla JS:

En utilisant find

const savedViews = [{"description":"object1","id":1},{"description":"object2","id":2},{"description":"object3","id":3},{"description":"object4","id":4}];

const view = 'object2';

const delete_id = savedViews.find(obj => {
  return obj.description === view;
}).id;

console.log(delete_id);

Utilisation de filter(réponse originale)

const savedViews = [{"description":"object1","id":1},{"description":"object2","id":2},{"description":"object3","id":3},{"description":"object4","id":4}];

const view = 'object2';

const delete_id = savedViews.filter(function (el) {
  return el.description === view;
})[0].id;

console.log(delete_id);


6
C'est vrai, mais lodash semble tellement plus propre, je n'ai pas à utiliser [0]c'est la solution avec laquelle je vais var delete_id = _.result(_.find(savedViews, { 'description': view }), 'id');Merci pour la démo tho +1
Leon Gaban

Cela ne va-t-il pas échouer lorsque vous forcez [0] à sortir un résultat vide? Donc +1 à @LeonGaban que Lodash devrait gérer cela par défaut.
kiradotee

3
@LeonGaban vous pouvez toujours utiliser un nettoyant sans lodash sans [0] utiliser ES6 savedViews.find(el => el.description === view)
Ram Babu S

Réponse géniale !!
Ole

11

Avec la findméthode, votre rappel recevra la valeur de chaque élément, comme:

{
    description: 'object1', id: 1
}

Ainsi, vous voulez un code comme:

_.find(savedViews, function(o) {
        return o.description === view;
})

8

pour cela, recherchez l'objet donné dans un tableau, un exemple d'utilisation de base de _.find

const array = 
[
{
    description: 'object1', id: 1
},
{
    description: 'object2', id: 2
},
{
    description: 'object3', id: 3
},
{
    description: 'object4', id: 4
}
];

cela fonctionnerait bien

q = _.find(array, {id:'4'}); // delete id

console.log(q); // {description: 'object4', id: 4}

_.find aidera à renvoyer un élément dans un tableau, plutôt que son index. Donc, si vous avez un tableau d'objets et que vous voulez trouver un seul objet dans le tableau par une certaine valeur de clé, pare _.find est le bon outil pour le travail.


7

Vous n'avez pas besoin de Lodash ou Ramda ou de toute autre dépendance supplémentaire.

Utilisez simplement la fonction find () de l'ES6 de manière fonctionnelle:

savedViews.find(el => el.description === view)

Parfois, vous devez utiliser des bibliothèques tierces pour obtenir tous les avantages qui les accompagnent. Cependant, de manière générale, essayez d'éviter les dépendances lorsque vous n'en avez pas besoin . Les dépendances peuvent:

  • gonfler la taille de votre code groupé,
  • vous devrez les tenir à jour,
  • et ils peuvent introduire des bogues ou des risques de sécurité

Très bonne réponse!! Exactement ce que je cherchais.
Ole

6
var delete_id = _(savedViews).where({ description : view }).get('0.id')

6

Vous pouvez utiliser ce qui suit

import { find } from 'lodash'

Ensuite, pour renvoyer l'objet entier (pas seulement sa clé ou sa valeur) à partir de la liste avec ce qui suit:

let match = find(savedViews, { 'ID': 'id to match'});

4

Importer lodashavec

$ npm i - enregistrer lodash

var _ = require('lodash'); 

var objArrayList = 
    [
         { name: "user1"},
         { name: "user2"}, 
         { name: "user2"}
    ];

var Obj = _.find(objArrayList, { name: "user2" });

// Obj ==> { name: "user2"}

ajouter plus de détails
King Stone

1

Récupérer l'identifiant en fonction du nom

 {
    "roles": [
     {
      "id": 1,
      "name": "admin",
     },
     {
      "id": 3,
      "name": "manager",
     }
    ]
    }



    fetchIdBasingOnRole() {
          const self = this;
          if (this.employee.roles) {
            var roleid = _.result(
              _.find(this.getRoles, function(obj) {
                return obj.name === self.employee.roles;
              }),
              "id"
            );
          }
          return roleid;
        },
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.