¿Cómo usar lodash para encontrar y devolver un objeto de Array?


148

Mis objetos:

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

En mi función a continuación, paso la descripción para encontrar la ID coincidente:

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

Estoy tratando de usar el método de búsqueda de lodash: https://lodash.com/docs#find

Sin embargo, mi variable delete_idestá saliendo indefinida.


Actualización para las personas que revisan esta pregunta, Ramda es una buena biblioteca para hacer lo mismo que lodash, pero en una forma de programación más funcional :) http://ramdajs.com/0.21.0/docs/


1
No me _.findqueda claro por qué crees que mágicamente pasaría solo una de las propiedades a la devolución de llamada. Un simple console.log(description)en la devolución de llamada podría haberle dicho eso.
Felix Kling

Respuestas:


176

El argumento pasado a la devolución de llamada es uno de los elementos de la matriz. Los elementos de su matriz son objetos de la forma {description: ..., id: ...}.

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

Otra alternativa más de los documentos a los que se vinculó (lodash v3):

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

Lodash v4:

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

44
¡Gracias! Me acabo de enterar que esto también funciona var delete_id = _.result(_.find(savedViews, { 'description': view }), 'id');También 10 minutos más ...
Leon Gaban

La segunda solución es incorrecta, el predicado debe ser una matriz para usar matchProperty taquigrafía: debería ser_.find(savedViews, ['description', view])
franksands

1
@FranciscoGuimaraes: Bueno, en 2015, así fue como funcionó lodash
Felix Kling

1
@FelixKling Sospeché que podría ser algo como esto, pero pensé que sería mejor agregar un comentario para las personas (como yo) que buscan una respuesta en 2018. Gracias por la actualización en la respuesta
franksands


29

Puedes hacer esto fácilmente en vanilla JS:

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

Usando filter(respuesta original)

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


66
Es cierto, pero lodash parece mucho más limpio, no tengo que usar [0]esta es la solución con la que voy. var delete_id = _.result(_.find(savedViews, { 'description': view }), 'id');Gracias por la demostración aunque +1
Leon Gaban

¿No va a fallar cuando fuerces [0] a sacar un resultado vacío? Entonces +1 a @LeonGaban que Lodash debería manejar por defecto.
kiradotee

3
@LeonGaban aún puede usar limpiador sin lodash sin [0] usando ES6 savedViews.find(el => el.description === view)
Ram Babu S

Respuesta impresionante !!
Ole

11

Con el findmétodo, su devolución de llamada va a pasar el valor de cada elemento, como:

{
    description: 'object1', id: 1
}

Por lo tanto, desea un código como:

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

8

para esto encuentre el objeto dado en una matriz, un ejemplo de uso básico de _.find

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

esto funcionaría bien

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

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

_.find ayudará a devolver un elemento en una matriz, en lugar de su índice. Entonces, si tiene una matriz de objetos y desea encontrar un solo objeto en la matriz por un cierto valor clave, pare _.find es la herramienta adecuada para el trabajo.


7

No necesita Lodash o Ramda ni ninguna otra dependencia adicional.

Simplemente use la función ES6 find () de manera funcional:

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

A veces necesitas usar bibliotecas de terceros para obtener todos los artículos que vienen con ellas. Sin embargo, en general, trate de evitar las dependencias cuando no las necesite . Las dependencias pueden:

  • hincha el tamaño de tu código incluido,
  • tendrás que mantenerlos actualizados,
  • y pueden introducir errores o riesgos de seguridad

¡¡Gran respuesta!! Exactamente lo que estaba buscando.
Ole

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

6

Puedes usar lo siguiente

import { find } from 'lodash'

Luego, para devolver el objeto completo (no solo su clave o valor) de la lista con lo siguiente:

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

4

Importar lodashusando

$ npm i --save lodash

var _ = require('lodash'); 

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

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

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

añadir más detalles
King Stone

1

Fetch id basándose en el nombre

 {
    "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;
        },
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.