2011-06-07 13 views
8

इस जेएस तो मेरे पास है शाब्दिक वस्तु:जेएस ऑब्जेक्ट लिटलल को कैसे क्रमबद्ध करें?

var foo = { 
    Sussy: 4, 
    Billy: 5, 
    Jimmy: 2, 
    Sally: 1 
}; 

मैं एक नया, हल कर वस्तु शाब्दिक बना सकते हैं कैसे:

var bar = { 
    Sally: 1, 
    Jimmy: 2, 
    Sussy: 4, 
    Billy: 5 
}; 
+1

आप अपने प्रश्न में दिखाए गए जेएस ऑब्जेक्ट को सॉर्ट नहीं कर सकते हैं। असंभव। क्यूं कर? क्योंकि जेएस ऑब्जेक्ट गुणों का आदेश नहीं दिया जाता है। एक सरणी पर स्विच करें। Arrays आदेश दिया जाता है, वस्तुओं नहीं हैं। –

उत्तर

9

पुन :: जेएस ऑब्जेक्ट को कैसे क्रमबद्ध करें?

उत्तर: आप नहीं कर सकते। तो इसके बजाय, आपको एक अधिक परिष्कृत डेटा संरचना की आवश्यकता है। आपके पास कई विकल्प हैं:

  1. आप ऑब्जेक्ट की चाबियों के क्रम को पकड़ने के लिए एक अलग सरणी का उपयोग कर सकते हैं। (यही है @ फ़ेलिक्स क्लिंग का जवाब दर्शाता है।) अच्छा: आदेश या नाम के माध्यम से तेज़ पुनर्प्राप्ति। खराब: दूसरी डेटा संरचना की आवश्यकता है जिसे पहले के साथ सिंक किया जाना चाहिए।
  2. ऑब्जेक्ट के बजाय केवल गुणों और मानों को धारण करने के बजाय, गुण ऑब्जेक्ट्स को पकड़ सकते हैं जो मूल्यों और सॉर्ट ऑर्डर को धारण करते हैं। अच्छा: 1 डेटा संरचना। संपत्ति के नाम से फास्ट लुकअप। खराब: ऑर्डर द्वारा धीमी लुकअप (संरचना को स्कैन करने की आवश्यकता है)। धीमी छंटनी
  3. कुंजी और मूल्य रखने वाले ऑब्जेक्ट्स वाले तत्वों के साथ एक सरणी का उपयोग करें। अच्छा: 1 डेटा संरचना। आदेश द्वारा फास्ट लुकअप। फास्ट सॉर्टिंग खराब: संपत्ति के नाम से धीमी लुकअप (संरचना को स्कैन करने की आवश्यकता है)।

मैं समाधान 3 की अनुशंसा करता हूं क्योंकि यह आदेश प्रबंधन के लिए जेएस यांत्रिकी का उपयोग करता है।

उदाहरण:

// Object holds sort order: (Solution 2) 
var foo = { 
    Suzy: {v: 4, order: 0}, 
    Billy: {v: 5, order: 1}, 
    Jimmy: {v: 2, order: 2}, 
    Sally: {v: 1, order: 3} 
};  

// Array holds keys: (Solution 3) 
var woof = [ 
    {k: 'Suzy', v: 4}, 
    {k: 'Billy', v: 5}, 
    {k: 'Jimmy', v: 2}, 
    {k: 'Sally', v: 1} 
]; 

// Sort the woof array by the key names: 
woof.sort(function(a, b) { 
    return a.k.localeCompare(b.k); 
}); 

// The third key and value: 
woof[2].k; // the third key 
woof[2].v; // the third value 

संपादित: टाइपो ठीक करने के लिए अद्यतन कोड। धन्यवाद, @ मार्टिन फिडो

+0

+1 मुझे तीसरा विकल्प भी पसंद है :) –

+0

मुझे सही ट्रैक और सभी विवरण डालने के लिए धन्यवाद। मैं # 3 कोशिश करूंगा। – edt

+1

@ लैरीक - ने मुझे जाम में मदद की। धन्यवाद। – dopatraman

6

वस्तु गुण कोई विशेष क्रम में हैं (आदेश कार्यान्वयन निर्भर है) और आप गुणों को सॉर्ट नहीं कर सकते हैं।

उदाहरण के लिए आप कुंजी की एक सरणी रखने और तदनुसार सॉर्ट करने के लिए, है:

var keys = []; 

for(var key in obj) { 
    if(obj.hasOwnProperty(key)) { 
     keys.push(key); 
    } 
} 

keys.sort(function(a, b) { 
    return obj[a] - obj[b]; 
}); 

अब आप सरणी के मूल्यों पर पुनरावृति और वस्तु की इसी संपत्ति का उपयोग करने के लिए उपयोग कर सकते हैं।

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