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/

Leon Gaban
sumber
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]);
Felix Kling
sumber
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
189

lodash dan ES5

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

lodash dan ES6

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

docs di https://lodash.com/docs#find

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

Andy
sumber
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;
})
Dancrumb
sumber
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.

Afaq Ahmed Khan
sumber
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
xeiton
sumber
Jawaban bagus !! Persis apa yang saya cari.
Ole
6
var delete_id = _(savedViews).where({ description : view }).get('0.id')
robertklep
sumber
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'});
Bican M. Valeriu
sumber
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"}
ABHIJEET KHIRE
sumber
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;
        },
Atchutha rama reddy Karri
sumber