2015-11-26 7 views
21

मैं मानचित्र के सभी मूल्यों पर पुन: प्रयास करना चाहता हूं। मुझे पता है कि यह iterate over all keys के लिए संभव है। लेकिन क्या मूल्यों पर सीधे पुनरावृत्ति करना संभव है?जावास्क्रिप्ट: मानचित्र के मूल्यों पर इटरेट

var map = { key1 : 'value1', key2 : 'value2' } 
for (var key in map) { ...} // iterates over keys 
+1

सवाल तो आम है, कि मुझे आश्चर्य है कि किसी ने पहले यह नहीं पूछा था। लेकिन मुझे स्टैक ओवरफ्लो पर ऐसा कोई सवाल नहीं मिल रहा है। –

+0

यू iterate केवीपी। केवल चाबियाँ नहीं, आप चाबियाँ मानों या दोनों पुनरावृत्ति के भीतर पहुंच सकते हैं। मानचित्र [कुंजी] पुनरावृत्ति –

+0

@kcbeard का मूल्य होगा - क्या आप कुछ सबूत/विनिर्देश के साथ अपने दावे (* यू iterate kvp's *) का समर्थन कर सकते हैं? – Amit

उत्तर

23

यह नक्शा नहीं है। यह बस एक Object है।

संपादित करें:कोड के नीचे ओपी की तुलना में भी बदतर है, क्योंकि अमित ने टिप्पणियों में बताया।

आप वास्तव में साथ कुंजी से अधिक पुनरावृत्ति द्वारा "मूल्यों पर पुनरावृति" कर सकते हैं:

var value; 
Object.keys(map).forEach(function(key) { 
    value = map[key]; 
    console.log(value); 
}); 
+2

मुझे उम्मीद थी कि एक और शानदार तरीका होगा। –

+0

@ माथियास यह पहली बार ऐसा नहीं प्रतीत हो सकता है, लेकिन जब आप एक महत्वपूर्ण बिंदु पर विचार करते हैं तो यह पूरी समझ में आता है: किसी ऑब्जेक्ट में गुणों का क्रम लागू नहीं किया जाता है। जैसे यदि आप '{a: 1, b: 2, c: 3} 'कहते हैं और लूप के लिए या' ऑब्जेक्ट.की 'के माध्यम से जाते हैं, तो आपको वास्तव में 1, 2, 3 जाने की गारंटी नहीं है, इसलिए प्रत्यक्ष लूपिंग मूल्य ज्यादा समझ में नहीं आता है। 'के लिए ... (और ऑब्जेक्ट.की) एक लूप के करीब है जो केवल कहता है" जबकि अभी भी गुण शेष हैं, एक और संपत्ति प्राप्त करें "। 'कुंजी' आपको आदेश लागू करने के लिए एक स्थान देता है, उदा। 'Object.keys (myobj) .sort() .Each (x => console.log (x)' –

+4

मुझे नहीं लगता कि यह कैसे बेहतर है ओपी के लिए (मानचित्र में var कुंजी) {map [key] } '। यह लंबा, कम पठनीय है, यह स्मृति को बर्बाद कर देता है, यह निष्पादन धीमा है - क्या ऐसा करने का कोई कारण है? – Amit

0

नहीं, वस्तुओं के साथ ऐसा करने के लिए कोई सीधी विधि नहीं है।

Map प्रकार एक values() विधि है कि मूल्यों

6

भावना मुझे लगता है कि आप चाहते हैं के लिए एक iterator देता है, ES5 या ES2015, कोई में, अपनी ओर से कुछ काम के बिना नहीं होता है।

ES2016 में, शायद object.values के साथ।

आपको लगता है कि जावास्क्रिप्ट में Arrays प्रभावी रूप से एक मान से एक पूर्णांक से एक मानचित्र हैं, और जावास्क्रिप्ट सरणी में मान सीधे गणना की जा सकती हैं।

['foo', 'bar'].forEach(v => console.log(v)); // foo bar 

इसके अलावा, ES2015 में, आप एक वस्तु iterable Symbol.iterator के नाम के साथ एक संपत्ति पर एक समारोह रखकर कर सकते हैं:

var obj = { 
    foo: '1', 
    bar: '2', 
    bam: '3', 
    bat: '4', 
}; 

obj[Symbol.iterator] = iter.bind(null, obj); 

function* iter(o) { 
    var keys = Object.keys(o); 
    for (var i=0; i<keys.length; i++) { 
     yield o[keys[i]]; 
    } 
} 

for(var v of obj) { console.log(v); } // '1', '2', '3', '4' 

इसके अलावा, अन्य उत्तर प्रति, वहाँ अन्य बनाया-इन कर रहे हैं जो आपको इच्छित कार्यक्षमता प्रदान करता है, जैसे Map (लेकिन WeakMap क्योंकि यह पुन: प्रयोज्य नहीं है) और Set उदाहरण के लिए (लेकिन ये अभी तक सभी ब्राउज़रों में मौजूद नहीं हैं)।

संबंधित मुद्दे