2011-03-17 16 views
5

जावास्क्रिप्ट में मेरे पास एक JSON ऑब्जेक्ट है जिसमें से मैं केवल आइटम्स को संसाधित करना चाहता हूं:मैं जावास्क्रिप्ट में पाइथन के dict.items() को दोहरा सकता हूं?

var json = { 
    itema: {stuff: 'stuff'}, 
    itemb: {stuff: 'stuff'}, 
    itemc: {stuff: 'stuff'}, 
    itemd: {stuff: 'stuff'} 
} 

पायथन में मैं

print json.items() 
[{stuff: 'stuff'},{stuff: 'stuff'},{stuff: 'stuff'},{stuff: 'stuff'}] 

कर सकता हूं क्या मैं यह कर सकता हूं?

+1

मुझे शायद यह जोड़ना चाहिए कि _reason_ मैं ऐसा करना चाहता हूं ताकि मैं सरणी को क्रमबद्ध कर सकूं (चाबियां केवल यूआईडी हैं), तो शायद मुझे "एसोसिएटिव सरणी में आइटम्स को सॉर्ट करने के तरीके" से पूछा जाना चाहिए था। –

+0

सवाल गलत है। पायथन का 'dict.items()' (कुंजी, मान) tuples की एक सूची देता है। Retval का आपका उदाहरण 'dict.values ​​()' से मेल खाता है। –

उत्तर

3

आप ऑब्जेक्ट.प्रोटोटाइप को विस्तारित किए बिना पाइथन में ऐसा नहीं कर सकते हैं, जिसे आप नहीं करना चाहते हैं, क्योंकि यह दुख का मार्ग है।

आप एक सहायक समारोह आसानी से वस्तु पर कि सका पाश बना सकते हैं और इस तरह से हालांकि एक सरणी में मूल्य रखा है, हो सकता है:

function items(obj) { 
var i, arr = []; 
for(i in obj) { 
    arr.push(obj[i]); 
} 
return arr; 
} 

पी.एस.: JSON एक डेटा प्रारूप है, क्या आपके पास एक वस्तु है शाब्दिक।

+0

ऑब्जेक्ट शब्दशः के बारे में लिया गया बिंदु, वे जेएस में इतनी बारीकी से जुड़े हुए हैं कि आप मुझे उस पर माफ कर सकते हैं। –

-2

सुनिश्चित नहीं है कि आप क्या करना चाहते हैं लेकिन मुझे लगता है कि जेसन.स्ट्रिंगिफा ऐसा कुछ करेगा। देखें http://www.json.org/js.html

1

पायथन dict.itemsdict दोनों की चाबियाँ और मान दोनों युक्त टुपल्स की एक सूची देता है। जावास्क्रिप्ट में tuples नहीं है, तो यह एक घोंसला सरणी होना होगा।

यदि आप अंतर दिखाने के लिए मुझे थोड़ा पाइथन कोड क्षमा करेंगे।

>>> {1:2, 2:3}.items() 
[(1, 2), (2, 3)] 
>>> {1:2, 2:3}.values() 
[2, 3] 

मैं स्वीकार किए जाते हैं जवाब वस्तुओं के मूल्यों की एक सरणी है, जो अजगर समारोह dict.values के बराबर है रिटर्न को देखते हैं। dict.items के लिए क्या पूछा जाता है। ऐसा करने के लिए बस लूप करें और 2 तत्व सरणी के घोंसला वाले सरणी का निर्माण करें।

function items(obj){ 

    var ret = []; 
    for(v in obj){ 
     ret.push(Object.freeze([v, obj[v]])); 
    } 
    return Object.freeze(ret); 
} 

मैं Object.freeze में डाल पंडिताऊ हो सकता है और लागू है कि दिए गए मान परिवर्तित नहीं किया जाना चाहिए, अजगर tuples के अचल स्थिति का अनुकरण करने के लिए। जाहिर है यह अभी भी काम करता है अगर आप इसे बाहर ले जाते हैं।

ऐसा लगता है कि ऐसा करने में कुछ हद तक जब साहचर्य फैशन के बजाय एक रेखीय में वस्तु पर पुनरावृत्ति में है कि यह प्रयोग किया जाता है items के प्रयोजन धरा और यह हैश मान की गणना के साहचर्य सरणी में प्रत्येक तत्व को देखने के लिए बचा जाता है । छोटी वस्तुओं के लिए जो परवाह करते हैं लेकिन बड़े लोगों के लिए यह आपको धीमा कर सकता है और जावास्क्रिप्ट में जो भी आप चाहते हैं उसे करने के लिए एक और बेवकूफ तरीका हो सकता है।

ऐसा करने का एक और नया तरीका Object.entries() का उपयोग करना है जो आप वही करेंगे जो आप चाहते हैं।

Object.entries({1:1, 2:2, 3:3}) 
     .forEach(function(v){ 
      console.log(v) 
     }); 

समर्थन दस्तावेज़ में वर्णित उन ब्राउज़र संस्करणों तक सीमित है।

+0

आपको उस '.hasOwnProperty()' कॉल को छोड़ना चाहिए। कोई फायदा नहीं है। – Bergi

+0

नहीं, बस यह उसमें काफी व्यर्थ है। किस स्थिति के लिए अच्छा है?सामान्य ऑब्जेक्ट्स जिन्हें आप गणना करना चाहते हैं उन्हें विरासत में समेकित गुण नहीं होंगे। और यदि आप उन लोगों के खिलाफ बचाव करना चाहते हैं, तो आप निश्चित रूप से उन लोगों के खिलाफ बचाव करना चाहते हैं जिनके पास '.hasOwnProperty' गुण हैं। – Bergi

+0

ओह ठीक है धन्यवाद। हालांकि यह एक अभिभावक वर्ग से किसी भी संपत्ति को बाहर कर देगा। हालांकि मैं जावास्क्रिप्ट पर एक सापेक्ष नोब हूं, इसलिए इतना नहीं जानता। –

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