Làm thế nào để sử dụng lodash để tìm và trả về một đối tượng từ Array?


148

Đối tượng của tôi:

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

Trong chức năng của tôi dưới đây, tôi chuyển qua phần mô tả để tìm ID phù hợp:

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

Tôi đang cố gắng sử dụng phương thức tìm của lodash: https://lodash.com/docs#find

Tuy nhiên, biến của tôi delete_idkhông được xác định.


Cập nhật cho những người kiểm tra câu hỏi này, Ramda là một thư viện đẹp để thực hiện điều tương tự, nhưng theo cách lập trình nhiều chức năng hơn :) http://ramdajs.com/0.21.0/docs/


1
Tôi không rõ tại sao bạn nghĩ _.findsẽ chỉ chuyển một trong các thuộc tính cho cuộc gọi lại. Một đơn giản console.log(description)trong cuộc gọi lại có thể đã nói với bạn rằng.
Felix Kling

Câu trả lời:


176

Đối số được truyền cho hàm gọi lại là một trong các phần tử của mảng. Các yếu tố của mảng của bạn là các đối tượng của biểu mẫu {description: ..., id: ...}.

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

Một thay thế khác từ các tài liệu bạn liên kết đến (lodash v3):

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

Nhà nghỉ v4:

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

4
Cảm ơn! Tôi mới phát hiện ra rằng điều này cũng hoạt động var delete_id = _.result(_.find(savedViews, { 'description': view }), 'id');thêm 10 phút nữa ...
Leon Gaban

Giải pháp thứ hai là sai, vị ngữ phải là một mảng để sử dụng tốc ký diêm phù hợp: nó phải là_.find(savedViews, ['description', view])
franksands

1
@FranciscoGuimaraes: Chà, hồi năm 2015, đó là cách thức hoạt động của lodash
Felix Kling

1
@FelixKling Tôi nghi ngờ nó có thể giống như thế này, nhưng nghĩ tốt hơn là thêm một nhận xét cho những người (như tôi) đang tìm kiếm câu trả lời vào năm 2018. Cảm ơn đã cập nhật trong câu trả lời
franksands 25/07/18


29

Bạn có thể làm điều này một cách dễ dàng trong vanilla JS:

Sử dụng 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);

Sử dụng filter(câu trả lời gốc)

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
Đúng, nhưng lodash có vẻ sạch sẽ hơn rất nhiều, tôi không phải sử dụng [0]đây là giải pháp tôi sẽ dùng var delete_id = _.result(_.find(savedViews, { 'description': view }), 'id');Cảm ơn cho bản demo tho +1
Leon Gaban

Không phải nó sẽ thất bại khi bạn buộc [0] ra một kết quả trống sao? Vì vậy, +1 cho @LeonGaban mà Lodash nên xử lý theo mặc định.
kiradotee

3
@LeonGaban bạn vẫn có thể sử dụng trình dọn dẹp mà không cần lodash mà không cần [0] bằng ES6 savedViews.find(el => el.description === view)
Ram Babu S

Câu trả lời tuyệt vời !!
Ole

11

Với findphương thức, cuộc gọi lại của bạn sẽ được chuyển qua giá trị của từng thành phần, như:

{
    description: 'object1', id: 1
}

Vì vậy, bạn muốn mã như:

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

8

để tìm đối tượng đã cho trong một mảng, một ví dụ sử dụng cơ bản của _.find

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

điều này sẽ làm việc tốt

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

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

_.find sẽ giúp trả về một phần tử trong một mảng, thay vì chỉ mục của nó. Vì vậy, nếu bạn có một mảng các đối tượng và bạn muốn tìm một đối tượng trong mảng bằng một giá trị khóa nhất định pare _.find là công cụ phù hợp cho công việc.


7

Bạn không cần Lodash hoặc Ramda hoặc bất kỳ sự phụ thuộc bổ sung nào khác.

Chỉ cần sử dụng hàm ES6 find () theo cách chức năng:

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

Đôi khi bạn cần sử dụng các thư viện của bên thứ 3 để có được tất cả các tính năng đi kèm với chúng. Tuy nhiên, nói chung, hãy cố gắng tránh phụ thuộc khi bạn không cần chúng . Phụ thuộc có thể:

  • làm mờ kích thước mã gói của bạn,
  • bạn sẽ phải cập nhật chúng,
  • và họ có thể giới thiệu các lỗi hoặc rủi ro bảo mật

Câu trả lời chính xác!! Chính xác những gì tôi đang tìm kiếm.
Ole

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

6

Bạn có thể sử dụng như sau

import { find } from 'lodash'

Sau đó, để trả về toàn bộ đối tượng (không chỉ khóa hoặc giá trị của nó) từ danh sách với các mục sau:

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

4

Nhập khẩu lodashbằng cách sử dụng

$ npm i - lưu lại

var _ = require('lodash'); 

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

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

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

thêm chi tiết
King Stone

1

Tìm nạp id dựa trên tên

 {
    "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;
        },
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.