Bagaimana cara menggunakan lodash untuk menemukan dan mengembalikan objek dari Array?


148

Objek saya:

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

Dalam fungsi saya di bawah ini saya memberikan deskripsi untuk menemukan ID yang cocok:

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

Saya mencoba menggunakan metode pencarian lodash: https://lodash.com/docs#find

Namun variabel saya delete_idkeluar tidak terdefinisi.


Pembaruan untuk orang-orang yang memeriksa pertanyaan ini, Ramda adalah perpustakaan yang bagus untuk melakukan hal yang sama seperti halnya lodash, tetapi dengan cara pemrograman yang lebih fungsional :) http://ramdajs.com/0.21.0/docs/


1
Tidak jelas bagi saya mengapa Anda berpikir _.findsecara ajaib hanya akan melewati salah satu properti ke callback. Sederhana console.log(description)dalam panggilan balik bisa memberi tahu Anda itu.
— Felix Kling

Jawaban:


176

Argumen yang diteruskan ke panggilan balik adalah salah satu elemen dari array. Elemen-elemen dari array Anda adalah objek dari formulir {description: ..., id: ...}.

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

Alternatif lain dari dokumen yang Anda tautkan (lodash v3):

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

Lodash v4:

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

4
Terima kasih! Saya baru tahu bahwa ini juga berfungsi var delete_id = _.result(_.find(savedViews, { 'description': view }), 'id');10 menit lagi ...
— Leon Gaban

Solusi kedua salah, predikatnya harus berupa array untuk menggunakan matchProperty singkatan: seharusnya_.find(savedViews, ['description', view])
— franksand

1
@FranciscoGuimaraes: Nah, pada tahun 2015, begitulah cara kerja lodash
— Felix Kling

1
@FelixKling Saya menduga itu mungkin seperti ini, tetapi saya pikir lebih baik menambahkan komentar untuk orang (seperti saya) mencari jawaban pada tahun 2018. Terima kasih atas pembaruan dalam jawabannya
— franksands


29

Anda dapat melakukannya dengan mudah di vanilla JS:

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

Menggunakan filter(jawaban asli)

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
Benar, tetapi lodash tampaknya jauh lebih bersih, saya tidak harus menggunakan [0]ini adalah solusi yang saya akan gunakan var delete_id = _.result(_.find(savedViews, { 'description': view }), 'id');Terima kasih untuk demo tho +1
— Leon Gaban

Bukankah itu akan gagal ketika Anda memaksakan [0] hasil kosong? Jadi +1 ke @LeonGaban yang harus ditangani oleh Lodash secara default.
— Kiradotee

3
@LeonGaban masih bisa Anda gunakan pembersih tanpa lodash tanpa [0] menggunakan ES6 savedViews.find(el => el.description === view)
— Ram Babu S

Jawaban yang luar biasa !!
— Ole

11

Dengan findmetode ini, panggilan balik Anda akan melewati nilai setiap elemen, seperti:

{
    description: 'object1', id: 1
}

Jadi, Anda ingin kode seperti:

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

8

untuk ini temukan Objek yang diberikan dalam Array, contoh penggunaan dasar _.find

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

ini akan bekerja dengan baik

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

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

_.find akan membantu mengembalikan elemen dalam array, bukan indeksnya. Jadi jika Anda memiliki array objek dan Anda ingin menemukan objek tunggal dalam array dengan pare nilai kunci tertentu _.find adalah alat yang tepat untuk pekerjaan itu.


7

Anda tidak perlu Lodash atau Ramda atau ketergantungan ekstra lainnya.

Cukup gunakan fungsi ES6 find () dengan cara fungsional:

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

Terkadang Anda perlu menggunakan perpustakaan pihak ketiga untuk mendapatkan semua barang yang menyertainya. Namun, secara umum, cobalah menghindari ketergantungan ketika Anda tidak membutuhkannya . Ketergantungan dapat:

  • gembungkan ukuran kode yang Anda bundel,
  • Anda harus tetap memperbaruinya,
  • dan mereka dapat menimbulkan bug atau risiko keamanan

Jawaban bagus !! Persis apa yang saya cari.
— Ole

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

6

Anda dapat menggunakan yang berikut ini

import { find } from 'lodash'

Kemudian untuk mengembalikan seluruh objek (tidak hanya kunci atau nilainya) dari daftar dengan yang berikut:

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

4

Impor lodashmenggunakan

$ npm saya - simpan lodash

var _ = require('lodash'); 

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

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

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

tambahkan rincian lebih lanjut
— King Stone

1

Ambil id berdasarkan nama

 {
    "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;
        },
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.