วิธีใช้ lodash เพื่อค้นหาและส่งคืนวัตถุจาก Array


148

วัตถุของฉัน:

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

ในฟังก์ชั่นของฉันด้านล่างฉันผ่านในคำอธิบายเพื่อค้นหารหัสที่ตรงกัน:

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

ฉันกำลังพยายามใช้วิธีการค้นหาของ lodash: https://lodash.com/docs#find

อย่างไรก็ตามตัวแปรของฉันdelete_idออกมาไม่ได้กำหนด


อัปเดตสำหรับผู้ที่ตรวจสอบคำถามนี้ Ramda เป็นห้องสมุดที่ดีในการทำสิ่งเดียวกับที่ lodash ทำ แต่ด้วยวิธีการเขียนโปรแกรมที่ใช้งานได้ดีขึ้น :) http://ramdajs.com/0.21.0/docs/


1
มันไม่ชัดเจนสำหรับฉันว่าทำไมคุณคิดว่า_.findจะส่งผ่านคุณสมบัติหนึ่งเดียวไปยังการโทรกลับอย่างน่าอัศจรรย์ ง่าย ๆconsole.log(description)ในการติดต่อกลับอาจบอกคุณได้ว่า
เฟลิกซ์คลิง

คำตอบ:


176

อาร์กิวเมนต์ที่ส่งไปยัง callback เป็นหนึ่งในองค์ประกอบของอาร์เรย์ {description: ..., id: ...}องค์ประกอบของอาร์เรย์ของคุณเป็นวัตถุของแบบฟอร์ม

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

อีกทางเลือกหนึ่งจากเอกสารที่คุณเชื่อมโยงกับ (lodash v3):

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

Lodash v4:

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

4
ขอบคุณ! ฉันเพิ่งพบว่ามันใช้งานได้เช่นกันvar delete_id = _.result(_.find(savedViews, { 'description': view }), 'id');อีก 10 นาที ...
Leon Gaban

วิธีที่สองคือผิดเพรดิเคตต้องเป็นอาร์เรย์เพื่อใช้จับคู่คุณสมบัติรายการย่อ: ควรจะเป็น_.find(savedViews, ['description', view])
franksands

1
@FranciscoGuimaraes: อืมย้อนกลับไปในปี 2015 นั่นเป็นวิธีที่ lodash ทำงาน: lodash.com/docs/3.10.1#find
Felix Kling

1
@ FelixKling ฉันคิดว่ามันอาจจะเป็นแบบนี้ แต่คิดว่าจะเป็นการดีกว่าที่จะเพิ่มความคิดเห็นสำหรับผู้คน (เช่นฉัน) ที่กำลังมองหาคำตอบในปี 2018 ขอบคุณสำหรับการอัปเดตคำตอบ
franksands


29

คุณสามารถทำได้อย่างง่ายดายใน vanilla JS:

การใช้ 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);

ใช้filter(คำตอบเดิม)

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
จริง แต่ Lodash ดูเหมือนจะสะอาดกว่านี้ฉันไม่ต้องใช้[0]นี่เป็นวิธีแก้ปัญหาที่ฉันไปด้วยvar delete_id = _.result(_.find(savedViews, { 'description': view }), 'id');ขอขอบคุณสำหรับการสาธิตสรรพากร +1
Leon Gaban

จะไม่ล้มเหลวเมื่อคุณบังคับให้ [0] ออกผลลัพธ์ว่างเปล่าหรือไม่ ดังนั้น +1 ถึง @LeonGaban นั้น Lodash ควรจัดการตามค่าเริ่มต้น
kiradotee

3
@LeonGaban คุณยังสามารถใช้น้ำยาทำความสะอาดได้โดยไม่ต้องพักโดยไม่มี [0] โดยใช้ ES6 savedViews.find(el => el.description === view)
Ram Babu S

คำตอบที่ยอดเยี่ยม !!
โอเล

11

ด้วยfindวิธีการโทรกลับของคุณจะถูกส่งผ่านค่าของแต่ละองค์ประกอบเช่น:

{
    description: 'object1', id: 1
}

ดังนั้นคุณต้องการรหัสเช่น:

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

8

สำหรับการค้นหาวัตถุที่กำหนดใน Array ซึ่งเป็นตัวอย่างการใช้งานพื้นฐานของ _.find

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

มันจะทำงานได้ดี

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

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

_.find จะช่วยคืนค่าองค์ประกอบในอาร์เรย์แทนที่จะเป็นดัชนี ดังนั้นหากคุณมีอาเรย์ของวัตถุและคุณต้องการหาวัตถุชิ้นเดียวในอาเรย์โดยค่าคีย์บางอย่าง pare _.find เป็นเครื่องมือที่เหมาะสมสำหรับงาน


7

คุณไม่ต้องการ Lodash หรือ Ramda หรือการพึ่งพาพิเศษอื่น ๆ

เพียงใช้ฟังก์ชัน find ES6 ในวิธีการใช้งาน:

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

บางครั้งคุณต้องใช้ห้องสมุดบุคคลที่สามเพื่อรับสารพัดที่มากับพวกเขา แต่โดยทั่วไปพูดพยายามหลีกเลี่ยงการอ้างอิงเมื่อคุณไม่ต้องการพวกเขา การพึ่งพาสามารถ:

  • ขยายขนาดรหัสรวมของคุณ
  • คุณจะต้องทำให้ทันสมัย
  • และพวกเขาสามารถแนะนำข้อบกพร่องหรือความเสี่ยงด้านความปลอดภัย

คำตอบที่ดี !! สิ่งที่ฉันกำลังมองหา
โอเล่


6

คุณสามารถใช้สิ่งต่อไปนี้

import { find } from 'lodash'

จากนั้นให้ส่งคืนวัตถุทั้งหมด (ไม่เพียง แต่เป็นคีย์หรือค่า) จากรายการด้วยรายการต่อไปนี้:

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

4

นำเข้าlodashโดยใช้

$ npm i - บันทึก lodash

var _ = require('lodash'); 

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

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

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

เพิ่มรายละเอียดเพิ่มเติม
King Stone

1

Fetch id อ้างอิงชื่อ

 {
    "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;
        },
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.