2009-08-31 18 views
49

मैं थोड़ी देर के लिए देख रहे हैं और इस तरह एक जावास्क्रिप्ट वस्तु सॉर्ट करने के लिए एक तरह से हैं:संपत्ति नाम से एक जावास्क्रिप्ट वस्तु छंटाई

{ 
    method: 'artist.getInfo', 
    artist: 'Green Day', 
    format: 'json', 
    api_key: 'fa3af76b9396d0091c9c41ebe3c63716' 
} 

और प्रकार प्राप्त करने के लिए नाम के आधार पर वर्णक्रमानुसार है:

{ 
    api_key: 'fa3af76b9396d0091c9c41ebe3c63716', 
    artist: 'Green Day', 
    format: 'json', 
    method: 'artist.getInfo' 
} 

मुझे ऐसा कोई कोड नहीं मिल रहा है जो यह करेगा। क्या कोई मुझे कुछ मदद दे सकता है?

+0

http://www.javascriptkit.com/javatutors/arraysort.shtml - जटिल जेएस ऑब्जेक्ट्स को सॉर्ट करने पर निरंतर ट्यूटोरियल। http://www.highdots.com/forums/javascript/re-sorting-json-data-270187.html - एक और उदाहरण --- यदि आप विवरण चाहते हैं तो यहां सॉर्ट फ़ंक्शन पर एक पूर्ण संदर्भ है https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Array/sort- अंतिम संपादन, मैं कसम खाता हूँ! –

+0

मुझे मिली समस्या यह है कि वे लेख दिखाते हैं कि वस्तुओं की सरणी को कैसे क्रमबद्ध करें। मैं ऑब्जेक्ट से भरे ऑब्जेक्ट को सॉर्ट करने की कोशिश कर रहा हूं। क्या वही उदाहरण मेरे मामले के लिए काम करेंगे, यदि ऐसा है तो आप एक उदाहरण प्रदान कर सकते हैं? क्षमा करें मैं वास्तव में इस पर अटक गया हूं: s – matto1990

+5

यह एक प्राचीन प्रश्न है, लेकिन मैं एक पेडेंट हूं, इसलिए अरबवें समय के लिए: JSON ऑब्जेक्ट जैसी कोई चीज़ नहीं है - कम से कम नहीं जिस तरह से आप इसका जिक्र कर रहे हैं। जावास्क्रिप्ट ऑब्जेक्ट्स और जेएसओएन स्ट्रिंग्स हैं। –

उत्तर

73

परिभाषा के अनुसार, order of keys in an object is undefined, तो शायद आप भविष्य में सबूत के तरीके में ऐसा करने में सक्षम नहीं होंगे। इसके बजाए, आपको इन चाबियों को सॉर्ट करने के बारे में सोचना चाहिए जब वस्तु वास्तव में उपयोगकर्ता को प्रदर्शित की जा रही है। आंतरिक रूप से इसका उपयोग करने वाले किसी भी तरह का क्रम वास्तव में कोई फर्क नहीं पड़ता है।

सम्मेलन के अनुसार, अधिकांश ब्राउज़र किसी ऑब्जेक्ट में कुंजी के क्रम को बनाए रखने के क्रम में बनाए रखेंगे। तो, आप ऐसा कर सकता है, लेकिन यह हमेशा काम करने की उम्मीद नहीं है:

function sortObject(o) { 
    var sorted = {}, 
    key, a = []; 

    for (key in o) { 
     if (o.hasOwnProperty(key)) { 
      a.push(key); 
     } 
    } 

    a.sort(); 

    for (key = 0; key < a.length; key++) { 
     sorted[a[key]] = o[a[key]]; 
    } 
    return sorted; 
} 
+0

पर ईएस 6 के लिए बेहतर उत्तर है जो पूरी तरह से काम करता है। मुझे भविष्य में ब्राउज़र में तोड़ने पर नजर रखना होगा, लेकिन ऐसा लगता है कि अब यह काम करता है। सहायता के लिए धन्यवाद :) – matto1990

+0

यह वास्तव में हमेशा काम कर सकता है, और इसे Ecmascript मानक में संहिताबद्ध किया जा रहा है, लेकिन यह अभी भी भरोसा करने के लिए एक सुरक्षित धारणा नहीं है, क्योंकि परिभाषित आदेश होने से "ऑब्जेक्ट" "। यदि आप ऑर्डर को परिभाषित करना चाहते हैं, तो आपको एक सरणी का उपयोग करना चाहिए। – Breton

+0

मुझे ऐसा करने का एकमात्र कारण यह है कि मूल्यों को एक बार क्रमबद्ध करें ताकि मैं इस पृष्ठ पर परिभाषित एपीआई हस्ताक्षर उत्पन्न कर सकूं जैसा कि अनुभाग 6: http://www.last.fm/api/webauth यदि मैं उपयोग कर रहा था इसके लिए मैं एक सरणी का उपयोग करता हूं और उन्हें क्रमबद्ध करता हूं। – matto1990

12

इस समारोह एक वस्तु लेता है और फार्म की सरणियों का एक क्रमबद्ध सरणी रिटर्न [कुंजी, मूल्य]

function (o) { 
    var a = [],i; 
    for(i in o){ 
    if(o.hasOwnProperty(i)){ 
     a.push([i,o[i]]); 
    } 
    } 
    a.sort(function(a,b){ return a[0]>b[0]?1:-1; }) 
    return a; 
} 

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

3
// if ya need old browser support 
Object.keys = Object.keys || function(o) { 
var result = []; 
for(var name in o) { 
    if (o.hasOwnProperty(name)) 
     result.push(name); 
} 
    return result; 
}; 

var o = {c: 3, a: 1, b: 2}; 
var n = sortem(o); 

function sortem(old){ 
    var newo = {}; Object.keys(old).sort().forEach(function(k) {new[k]=old[k]}); 
    return newo; 
} 

// deep 
function sortem(old){ 
    var newo = {}; Object.keys(old).sort().forEach(function(k){ newo[k]=sortem(old[k]) }); 
    return newo; 
} 
sortem({b:{b:1,a:2},a:{b:1,a:2}}) 
+0

काफी अच्छा और चालाक, लेकिन दुर्भाग्यवश Object.keys() IE <9 में समर्थित नहीं है और किसी भी IE> = 9 के क्विर्क मोड में भी नहीं है। [एमएसडीएन का आईई देव केंद्र] देखें (http://msdn.microsoft.com/en-us/library/ie/ff688127 (v = vs.94) .aspx)। – Jpsy

+0

ऊपर दिए गए उत्तर में पॉली भरें –

+0

यदि आप ओबीजे के गहरे प्रकार का मतलब है, तो मैंने ऊपर दिए गए उत्तर को संपादित किया है। 'नया' एक टाइपो था। –

4

जब आप तुलना करने या परिणामों को हश करने की आवश्यकता है तो बस sorted stringify() का उपयोग करें।

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