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/

Léon Gaban
la source
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]);
Félix Kling
la source
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
189

lodash et ES5

var song = _.find(songs, {id:id});

lodash et ES6

let song = _.find(songs, {id});

docs sur https://lodash.com/docs#find

danday74
la source
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);

Andy
la source
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;
})
Dancrumb
la source
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.

Afaq Ahmed Khan
la source
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é
xeiton
la source
Très bonne réponse!! Exactement ce que je cherchais.
Ole
6
var delete_id = _(savedViews).where({ description : view }).get('0.id')
robertklep
la source
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'});
Bican M. Valeriu
la source
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"}
ABHIJEET KHIRE
la source
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;
        },
Atchutha rama reddy Karri
la source