Lodash के साथ जावास्क्रिप्ट ऑब्जेक्ट में गुणों के माध्यम से लूप


123

क्या जावास्क्रिप्ट ऑब्जेक्ट में गुणों के माध्यम से लूप करना संभव है? उदाहरण के लिए, मेरे पास इस रूप में परिभाषित एक जावास्क्रिप्ट ऑब्जेक्ट है:

myObject.options = {
  property1: 'value 1',
  property2: 'value 2'
};

गुण गतिशील रूप से इस ऑब्जेक्ट में जुड़ जाएंगे। क्या मेरे लिए एक तरीका है कि मैं बस के माध्यम से लूप करूं और जांच करूं कि क्या कोई संपत्ति मौजूद है? यदि हां, तो कैसे?

जवाबों:


34

हाँ आप कर सकते हैं और लॉश की जरूरत नहीं है ... यानी

for (var key in myObject.options) {
  // check also if property is not inherited from prototype
  if (myObject.options.hasOwnProperty(key)) { 
    var value = myObject.options[key];
  }
}

संपादित करें : स्वीकृत उत्तर ( _.forOwn () ) https://stackoverflow.com/a/21311045/528262 होना चाहिए


6
+ मुझे पता है कि वे लॉशड फंक्शनल-स्टाइल चाहते हैं, मेरा सिर्फ एक तरीका था कि ओपी को समझा जा सकता है कि आप एक लाइब्रेरी पर निर्भर करते हुए एक ऑब्ल्ज डब्ल्यू / आउट को लूप कर सकते हैं (अगर वह चाहता है कि फंक्शंस सहित ओ / फंक्शंस भी हो)
stecb

39
किस मामले में, दोनों उत्तर प्रदान करना अच्छा होता।
२१:१६ बजे

1
का उपयोग करना lodashऔर यह केवल कष्टप्रद hasOwnPropertyचेक की आवश्यकता नहीं द्वारा उचित है
मगेंन

601

का उपयोग करें _.forOwn()

_.forOwn(obj, function(value, key) { } );

https://lodash.com/docs#forOwn

ध्यान दें कि forOwnचेक hasOwnProperty, जैसा कि आप आमतौर पर किसी ऑब्जेक्ट के गुणों पर लूपिंग करते समय करते हैं। forInयह जाँच नहीं करता।


22
यह नोट करना बहुत महत्वपूर्ण keyहै कि दूसरा परम है, लेकिन यह समझ में आता है
फिल

18

आपकी बताई गई इच्छा के लिए "अगर कोई संपत्ति मौजूद है, तो जांचें" आप सीधे लो-डैश का उपयोग कर सकते हैं has

var exists = _.has(myObject, propertyNameToCheck);

3

आप निश्चित रूप से वैनिला जेएस के साथ ऐसा कर सकते हैं, जैसा कि स्टेकब ने दिखाया है, लेकिन मुझे लगता eachहै कि यह मूल प्रश्न का सबसे अच्छा जवाब है कि इसे लॉश के साथ कैसे किया जाए।

_.each( myObject.options, ( val, key ) => { 
    console.log( key, val ); 
} );

जैसा कि जॉनीएचके ने उल्लेख किया है, ऐसी hasविधि भी है जो उपयोग के मामले के लिए सहायक होगी, लेकिन जो मूल रूप से कहा गया setहै उससे अधिक उपयोगी हो सकता है। मान लीजिए कि आपने इस वस्तु को गतिशील रूप से कुछ जोड़ना चाहा है:

let dynamicKey = 'someCrazyProperty';
let dynamicValue = 'someCrazyValue';

_.set( myObject.options, dynamicKey, dynamicValue );

मूल विवरण के आधार पर मैं इसे कैसे करूंगा।


2

उदाहरण के रूप में ऑब्जेक्ट को नीचे ले चलो

let obj = { property1: 'value 1', property2: 'value 2'};

पहले obj में सभी कुंजी लाने के लिए

let keys = Object.keys(obj) //it will return array of keys

और फिर इसके माध्यम से लूप करें

keys.forEach(key => //your way)

बस सभी को एक साथ रखना

Object.keys(obj).forEach(key=>{/*code here*/})

1

ES6 में, for..ofलूप का उपयोग करके किसी ऑब्जेक्ट के मूल्यों पर पुनरावृति करना भी संभव है । यह जावास्क्रिप्ट ऑब्जेक्ट्स के लिए बॉक्स के ठीक बाहर काम नहीं करता है, हालाँकि, जैसा कि आपको ऑब्जेक्ट पर एक @@ itter प्रॉपर्टी को परिभाषित करना होगा। यह निम्नानुसार काम करता है:

  • for..ofपाश क्रमिक प्रदान की इटरेटर वस्तु पर अगले () विधि बुला और प्रत्येक यात्रा के लिए मूल्य के रूप में दिए गए मान का उपयोग करके पूछते हैं, "वस्तु पर दोहराया जा करने के लिए" (के पुनरावर्तक वस्तु के लिए यह obj1 फोन करते हैं। Obj1 से अधिक पाश दोहराता पाश का।
  • @@ itter गुण, या Symbol.iterator गुण, obj1 में परिभाषित फ़ंक्शन को लागू करने से इटमैटर ऑब्जेक्ट प्राप्त होता है। यह वह फ़ंक्शन है जिसे आपको खुद को परिभाषित करना चाहिए, और इसे एक पुनरावृत्त वस्तु वापस करना चाहिए

यहाँ एक उदाहरण है:

const obj1 = {
  a: 5,
  b: "hello",
  [Symbol.iterator]: function() {
    const thisObj = this;
    let index = 0;
    return {
      next() {
        let keys = Object.keys(thisObj);
        return {
          value: thisObj[keys[index++]],
          done: (index > keys.length)
        };
      }
    };
  }
};

अब हम for..ofलूप का उपयोग कर सकते हैं :

for (val of obj1) {
  console.log(val);
}    // 5 hello

0

यह समझना उपयोगी होगा कि आपको लॉश के साथ ऐसा करने की आवश्यकता क्यों है। यदि आप केवल यह जांचना चाहते हैं कि क्या कोई कुंजी किसी वस्तु में मौजूद है, तो आपको लॉश की आवश्यकता नहीं है।

myObject.options.hasOwnProperty('property');

यदि आपकी तलाश यह देखना है कि क्या कोई मूल्य मौजूद है, तो आप उपयोग कर सकते हैं _.invert

_.invert(myObject.options)[value]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.