ऐरे से किसी वस्तु को खोजने और वापस करने के लिए कैलाश का उपयोग कैसे करें?


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

मैं लॉश की खोज विधि का उपयोग करने की कोशिश कर रहा हूं: https://lodash.com/docs#find

हालाँकि मेरा चर delete_idअपरिभाषित है।


इस प्रश्न की जाँच कर रहे लोगों के लिए अपडेट , रामदा एक ही काम करने के लिए एक अच्छा पुस्तकालय है, लेकिन इसे और अधिक कार्यात्मक प्रोग्रामिंग तरीके से :) http://ramdajs.com/0.21.0/docs/


1
यह मेरे लिए अस्पष्ट है कि आपको क्यों लगता है _.findकि जादुई रूप से कॉलबैक में केवल एक गुण पास होगा। console.log(description)कॉलबैक में एक सरल आपको बता सकता है।
फेलिक्स क्लिंग

जवाबों:


176

कॉलबैक के लिए दिया गया तर्क सरणी के तत्वों में से एक है। आपके एरे के तत्व फॉर्म की वस्तुएं हैं {description: ..., id: ...}

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

फिर भी आपके द्वारा लिंक किए गए डॉक्स (vash 3) से एक और विकल्प:

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

लोदश v4:

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

4
धन्यवाद! मुझे अभी पता चला है कि यह भी var delete_id = _.result(_.find(savedViews, { 'description': view }), 'id');10 से अधिक मिनट काम करता है ...
लियोन गबन

दूसरा समाधान गलत है, विधेय का मिलान माचिस की तीली का उपयोग करने के लिए एक सरणी होना चाहिए: यह होना चाहिए_.find(savedViews, ['description', view])
फ्रैंक

1
@FranciscoGuimaraes: ठीक है, 2015 में वापस, कि कैसे लॉश काम किया है: lodash.com/docs/3.10.1#find
फेलिक्स क्लिंग

1
@FelixKling मैं संदिग्ध यह कुछ इस तरह हो सकता है, लेकिन यह बेहतर लोग (मेरे जैसे) के लिए एक टिप्पणी जोड़ने के बारे में सोचा में 2018 जवाब में अद्यतन करने के लिए धन्यवाद एक जवाब की तलाश में
franksands


29

आप इसे वैनिला जेएस में आसानी से कर सकते हैं:

का उपयोग करते हुए 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
यह सच है, लेकिन लॉश बहुत साफ लगता है, मुझे इसका उपयोग करने की ज़रूरत नहीं है [0]मैं इस समाधान var delete_id = _.result(_.find(savedViews, { 'description': view }), 'id');के लिए धन्यवाद के साथ जा रहा हूँ डेमो थियो +1
लियोन गबन

जब आप खाली परिणाम निकालते हैं तो क्या यह विफल नहीं होगा? तो +1 से @LeonGaban को कि Lodash को डिफ़ॉल्ट रूप से संभालना चाहिए।
कीरादोटी

3
@LeGGan अभी भी आप ES6 का उपयोग किए बिना [बिना] क्लीनर का उपयोग कर सकते हैंsavedViews.find(el => el.description === view)
राम बाबू एस।

बहुत बढ़िया जवाब !!
ओले

11

findविधि के साथ , आपका कॉलबैक प्रत्येक तत्व के मान को पास करने वाला है, जैसे:

{
    description: 'object1', id: 1
}

इस प्रकार, आप कोड चाहते हैं:

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

8

इसके लिए दिए गए ऑब्जेक्ट को एक ऐरे में ढूंढें, _.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

आपको लोदाश या रामदा या किसी अन्य अतिरिक्त निर्भरता की आवश्यकता नहीं है।

एक कार्यात्मक तरीके से ईएस 6 फाइंड () फ़ंक्शन का उपयोग करें:

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

कभी-कभी आपको अपने साथ आने वाली सभी अच्छाइयों को प्राप्त करने के लिए तीसरे पक्ष के पुस्तकालयों का उपयोग करने की आवश्यकता होती है। हालांकि, आम तौर पर बोलना, निर्भरता से बचने की कोशिश करें जब आपको उनकी आवश्यकता न हो । निर्भरताएं कर सकते हैं:

  • अपने बंडल कोड का आकार ब्लोट करें,
  • आपको उन्हें अद्यतित रखना होगा,
  • और वे बग या सुरक्षा जोखिम पेश कर सकते हैं

बहुत बढ़िया जवाब!! ठीक वही जो मेरे द्वारा खोजा जा रहा था।
ओले


6

आप निम्नलिखित का उपयोग कर सकते हैं

import { find } from 'lodash'

फिर निम्नलिखित के साथ सूची से पूरी वस्तु (न केवल इसकी कुंजी या मूल्य) वापस करने के लिए:

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

4

lodashका उपयोग कर आयात करें

$ npm i - save लॉश

var _ = require('lodash'); 

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

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

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

अधिक विवरण जोड़ें
किंग स्टोन

1

नाम पर आधार आईडी लाना

 {
    "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;
        },
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.