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/


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

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


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


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

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.


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

Gute Antwort!! Genau das, wonach ich gesucht habe.
Ole

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

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

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

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;
        },
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.