Come usare lodash per trovare e restituire un oggetto dall'array?


148

I miei oggetti:

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

Nella mia funzione qui sotto sto passando la descrizione per trovare l'ID corrispondente:

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
    }
}

Sto cercando di utilizzare il metodo find di lodash: https://lodash.com/docs#find

Comunque la mia variabile delete_idsta venendo fuori indefinita.


Aggiornamento per chi verifica questa domanda, Ramda è una bella libreria per fare la stessa cosa di lodash, ma in un modo di programmazione più funzionale :) http://ramdajs.com/0.21.0/docs/


1
Non mi è chiaro perché pensi che _.findpasserebbe magicamente solo una delle proprietà al callback. Un semplice console.log(description)richiamo avrebbe potuto dirtelo.
Felix Kling,

Risposte:


176

L'argomento passato al callback è uno degli elementi dell'array. Gli elementi dell'array sono oggetti del modulo {description: ..., id: ...}.

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

Ancora un'altra alternativa ai documenti a cui hai collegato (lodash v3):

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

Lodash v4:

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

4
Grazie! Ho appena scoperto che funziona anche var delete_id = _.result(_.find(savedViews, { 'description': view }), 'id');anche altri 10 minuti ...
Leon Gaban,

La seconda soluzione è sbagliata, il predicato deve essere un array per usare la scorciatoia MatchProperty: dovrebbe essere_.find(savedViews, ['description', view])
franksands

1
@FranciscoGuimaraes: Beh, nel 2015, è così che ha funzionato lodash: lodash.com/docs/3.10.1#find
Felix Kling

1
@FelixKling Ho sospettato che potesse essere qualcosa del genere, ma ho pensato che fosse meglio aggiungere un commento per le persone (come me) che cercavano una risposta nel 2018. Grazie per l'aggiornamento nella risposta
francsands


29

Puoi farlo facilmente in JS vaniglia:

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

Utilizzo filter(risposta 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
È vero, ma lodash sembra molto più pulito, non devo usare [0]questa è la soluzione con cui sto andando var delete_id = _.result(_.find(savedViews, { 'description': view }), 'id');Grazie per la demo tho +1
Leon Gaban

Non fallirà quando forzi [0] un risultato vuoto? Quindi +1 a @LeonGaban che Lodash dovrebbe gestire per impostazione predefinita.
Kiradotee,

3
@LeonGaban puoi comunque usare il detergente senza lodash senza [0] usando ES6 savedViews.find(el => el.description === view)
Ram Babu S

Risposta fantastica !!
Ole,

11

Con il findmetodo, al tuo callback verrà passato il valore di ciascun elemento, come:

{
    description: 'object1', id: 1
}

Quindi, vuoi un codice come:

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

8

per questo trova l'oggetto specificato in un array, un esempio di utilizzo di base di _.find

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

questo funzionerebbe bene

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

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

_.find ti aiuterà a restituire un elemento in un array, piuttosto che il suo indice. Pertanto, se si dispone di una matrice di oggetti e si desidera trovare un singolo oggetto nella matrice con un determinato valore chiave pare _.find è lo strumento giusto per il lavoro.


7

Non hai bisogno di Lodash o Ramda o di altre dipendenze extra.

Basta usare la funzione find () di ES6 in modo funzionale:

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

A volte è necessario utilizzare librerie di terze parti per ottenere tutte le chicche che ne derivano. Tuttavia, in generale, cerca di evitare le dipendenze quando non ne hai bisogno . Le dipendenze possono:

  • gonfiare le dimensioni del codice in bundle,
  • dovrai tenerli aggiornati,
  • e possono introdurre bug o rischi per la sicurezza

Bella risposta!! Esattamente quello che stavo cercando.
Ole,

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

6

È possibile utilizzare quanto segue

import { find } from 'lodash'

Quindi per restituire l'intero oggetto (non solo la sua chiave o valore) dall'elenco con il seguente:

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

4

Importa lodashutilizzando

$ npm i - salva lodash

var _ = require('lodash'); 

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

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

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

aggiungi maggiori dettagli
King Stone

1

Recupera ID in base al nome

 {
    "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;
        },
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.