Wie verwende ich lodash, um ein Objekt von Array zu finden und zurückzugeben?

148

Meine Objekte:

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

In meiner Funktion unten übergebe ich die Beschreibung, um die passende ID zu finden:

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

Ich versuche, die Suchmethode von lodash zu verwenden: https://lodash.com/docs#find

Meine Variable delete_idwird jedoch undefiniert ausgegeben.


Update für die Menschen diese Frage auszuchecken, Ramda ist eine schöne Bibliothek , die gleiche Sache lodash zu tun hat, aber in einer Art und Weise funktionalen Programmierung :) http://ramdajs.com/0.21.0/docs/

Leon Gaban
quelle
1
Mir ist nicht klar, warum Sie denken, _.finddass nur eine der Eigenschaften auf magische Weise an den Rückruf übergeben wird. Ein einfacher console.log(description)Rückruf hätte Ihnen das sagen können.
Felix Kling

Antworten:

176

Das an den Rückruf übergebene Argument ist eines der Elemente des Arrays. Die Elemente Ihres Arrays sind Objekte des Formulars {description: ..., id: ...}.

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

Noch eine Alternative zu den Dokumenten, mit denen Sie verlinkt haben (lodash v3):

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

Lodash v4:

_.find(savedViews, ['description', view]);
Felix Kling
quelle
4
Vielen Dank! Ich habe gerade herausgefunden, dass dies auch funktioniert. var delete_id = _.result(_.find(savedViews, { 'description': view }), 'id');Auch noch 10 Minuten ...
Leon Gaban
Die zweite Lösung ist falsch, das Prädikat muss ein Array sein, um die Kurzform "matchProperty" zu verwenden: es sollte sein_.find(savedViews, ['description', view])
franksands
1
@FranciscoGuimaraes: Nun, im Jahr 2015 hat so Lodash funktioniert: lodash.com/docs/3.10.1#find
Felix Kling
1
@FelixKling Ich vermutete, dass es so etwas sein könnte, dachte aber, es wäre besser, einen Kommentar für Leute (wie mich) hinzuzufügen, die 2018 nach einer Antwort suchen. Danke für das Update in der Antwort
franksands
189

lodash und ES5

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

lodash und ES6

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

Dokumente unter https://lodash.com/docs#find

danday74
quelle
29

Sie können dies einfach in Vanilla JS tun:

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

Verwenden filter(ursprüngliche Antwort)

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
quelle
6
Stimmt, aber lodash scheint so viel sauberer zu sein, dass ich [0]diese Lösung nicht verwenden muss. var delete_id = _.result(_.find(savedViews, { 'description': view }), 'id');Danke für die Demo tho +1
Leon Gaban
Wird es nicht scheitern, wenn Sie [0] ein leeres Ergebnis erzwingen? Also +1 an @LeonGaban, dass Lodash dies standardmäßig handhaben sollte.
Kiradotee
3
@LeonGaban noch können Sie Reiniger ohne lodash ohne [0] mit ES6 savedViews.find(el => el.description === view)
Ram Babu S
Super Antwort !!
Ole
11

Mit der findMethode wird Ihrem Rückruf der Wert jedes Elements übergeben, wie:

{
    description: 'object1', id: 1
}

Sie möchten also Code wie:

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

Suchen Sie dazu das angegebene Objekt in einem Array, einem grundlegenden Verwendungsbeispiel für _.find

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

das würde gut funktionieren

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

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

_.find hilft bei der Rückgabe eines Elements in einem Array anstelle seines Index. Wenn Sie also ein Array von Objekten haben und ein einzelnes Objekt im Array anhand eines bestimmten Schlüsselwerts suchen möchten, ist pare _.find das richtige Werkzeug für den Job.

Afaq Ahmed Khan
quelle
7

Sie benötigen weder Lodash noch Ramda oder andere zusätzliche Abhängigkeiten.

Verwenden Sie einfach die ES6-Funktion find () auf funktionale Weise:

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

Manchmal müssen Sie Bibliotheken von Drittanbietern verwenden, um alle mitgelieferten Extras zu erhalten. Vermeiden Sie jedoch im Allgemeinen Abhängigkeiten, wenn Sie sie nicht benötigen . Abhängigkeiten können:

  • Aufblähen Ihrer gebündelten Codegröße,
  • Sie müssen sie auf dem neuesten Stand halten,
  • und sie können Fehler oder Sicherheitsrisiken verursachen
Xeiton
quelle
Gute Antwort!! Genau das, wonach ich gesucht habe.
Ole
6
var delete_id = _(savedViews).where({ description : view }).get('0.id')
Robertklep
quelle
6

Sie können Folgendes verwenden

import { find } from 'lodash'

Geben Sie dann das gesamte Objekt (nicht nur seinen Schlüssel oder Wert) wie folgt aus der Liste zurück:

let match = find(savedViews, { 'ID': 'id to match'});
Bican M. Valeriu
quelle
4

Importieren lodashmit

$ npm i - Save Lodash

var _ = require('lodash'); 

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

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

// Obj ==> { name: "user2"}
ABHIJEET KHIRE
quelle
Weitere Details hinzufügen
King Stone
1

ID anhand des Namens abrufen

 {
    "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
quelle