प्रोटोटाइप का उपयोग करके जावास्क्रिप्ट में किसी वस्तु की प्रत्येक संपत्ति पर सूचना देना?


89

क्या प्रोटोटाइप जावास्क्रिप्ट ढांचे का उपयोग करके किसी वस्तु की प्रत्येक संपत्ति पर पुनरावृति करने का एक तरीका है?

यहाँ स्थिति है: मुझे JSON में AJAX प्रतिक्रिया मिल रही है जो कुछ इस तरह दिखती है:

{foo: 1, bar: 2, barobj: {75: true, 76: false, 85: true}}

यदि मैं एक चर में उस जसन प्रतिक्रिया का मूल्यांकन करता responseहूं, तो मैं यह देखना चाहता हूं कि response.barobjकौन सी इंडेक्स सही हैं और कौन सी गलत हैं।

प्रोटोटाइप दोनों है Object.keys()और Object.values()लेकिन अजीब तरह से एक सरल नहीं लगता Object.each()समारोह! मैं Object.keys () और Object.values ​​() का परिणाम ले सकता हूं और दूसरे को क्रॉस-रेफर कर सकता हूं क्योंकि मैं एक के माध्यम से पुनरावृति करता हूं, लेकिन यह ऐसी हैक है कि मुझे यकीन है कि इसे करने का एक उचित तरीका है!

जवाबों:


42

आपको अपनी वस्तु शाब्दिक को पहले एक प्रोटोटाइप हैश में बदलना होगा :

// Store your object literal
var obj = {foo: 1, bar: 2, barobj: {75: true, 76: false, 85: true}}

// Iterate like so.  The $H() construct creates a prototype-extended Hash.
$H(obj).each(function(pair){
  alert(pair.key);
  alert(pair.value);
});

उत्तम! यही वह है जिसकी तलाश में मैं हूं।
— ओवरलोड

57
दुर्भाग्य से एक समान प्रश्न को बंद कर दिया गया था, एक वह जो केवल प्रोटोटाइप के बिना एक साधारण जावास्क्रिप्ट ऑब्जेक्ट पर पुनरावृति करना चाहता था, मुझे अब इस उत्तर का इलाज करना होगा जैसे कि यह वही प्रश्न था जो "दोहराव" के कारण बंद हो गया था। इसलिए, भयानक उदाहरण यह उपयोगकर्ता को प्रोटोटाइप को लोड करने के लिए मजबूर करता है। उपयोगकर्ता ने प्रोटोटाइप के बारे में कुछ भी नहीं कहा ताकि उन्हें अवांछित लाइब्रेरी लोड करने के लिए मजबूर करना उपयोगी न हो। (याद रखें, यह मानकर कि यह वास्तव में एक डुप्लिकेट था)। यदि नकल के झूठे दावे के कारण अन्य प्रश्न को बंद नहीं किया गया था, तो मुझे जवाब देने से इनकार नहीं करना होगा।

2
क्या पूछने वाले का उल्लेख नहीं था कि वे प्रोटोटाइप चाहते थे (या प्रश्न संपादित किया गया था?)। वैसे भी यह सब अच्छा है
— एमरन

एक बाहरी पुस्तकालय लोड करने के लिए कोई ज़रूरत नहीं
— Healkiss

553

यहां प्रोटोटाइप की कोई आवश्यकता नहीं है: जावास्क्रिप्ट में for..inलूप हैं। यदि आप सुनिश्चित नहीं है कि कोई साथ गड़बड़ एक कर रहे हैं Object.prototype, की जांच hasOwnProperty()के साथ-साथ, यानी

for(var prop in obj) {
    if(obj.hasOwnProperty(prop))
        doSomethingWith(obj[prop]);
}

140
हमें अवांछित पुस्तकालय लोड करने के लिए मजबूर किए बिना वास्तविक उत्तर के लिए धन्यवाद।

8
यह कठोर जवाब नहीं है। प्रश्नों में कहा गया है कि प्रोटोटाइप का उपयोग किया जाना है! पसंद की स्वतंत्रता - हाहा ...
— स्वेन लार्सन

1
इस प्रश्न का मूल शीर्षक प्रोटोटाइप का उल्लेख करता है, जिसे मैंने स्पष्टता के लिए वापस जोड़ा है। यह प्रश्न, जैसा कि शरीर की पहली पंक्ति द्वारा दर्शाया गया है, विशेष रूप से एक ऐसे वातावरण के बारे में पूछ रहा था जिसमें प्रोटोटाइप उपयोग में है।
— ओवरलोड 5

1
जितना अधिक आप जावास्क्रिप्ट लिखते हैं, उतना ही आप forलूप्स को लिखने से नफरत करेंगे :)
— Triptych

13
दुर्भाग्य से यह सवाल है कि # 1 के रूप में पॉप अप होता है यदि आप Google "हर वस्तु संपत्ति जावास्क्रिप्ट पर कैसे पुनरावृत्ति करें" जैसे कुछ के लिए, तो यहां आने वाले बहुत से लोग वास्तव में इस प्रश्न के उत्तर की तलाश में हैं। वे जो प्रश्न चाहते हैं, वह यह है: stackoverflow.com/questions/921789/… , जिसका वास्तव में वस्तु शाब्दिक से कोई लेना-देना नहीं है।
— बैक्सिसिमो

0

आपको कुंजियों पर चलना चाहिए और वर्ग कोष्ठक का उपयोग करके मान प्राप्त करना चाहिए।

देखें: मैं एक जावास्क्रिप्ट ऑब्जेक्ट के गुणों की गणना कैसे करूं?

संपादित करें: जाहिर है, यह प्रश्न को दोहराता है।


प्रोटोटाइप डॉक्स में इस विधि को दृढ़ता से हतोत्साहित किया जाता है: prototypejs.org/api/array
— ओवरलोड

1
इसके अलावा, मुझे नहीं लगता कि यह कोई डुप्लिकेट है क्योंकि मैं एक प्रोटोटाइप-देशी समाधान की तलाश में था जो मुझे मिला है। दूसरा प्रश्न किसी ऐसे व्यक्ति के लिए सभ्य है जो यह नहीं चाहता कि यह एक फ्रेमवर्क का उपयोग करे, लेकिन यदि आप प्रोटोटाइप का उपयोग कर रहे हैं तो यह समाधान ज्यादा सुरक्षित है।
— ओवरलोड

1
@ ओवरलोड: आपने ध्यान से नहीं पढ़ा: एरे के गुणों पर पुनरावृति करने के लिए इसे हतोत्साहित किया जाता है, न कि सादे वस्तुओं को
— क्रिस्टोफ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.