2010-07-12 11 views
9

मेरे पास एक JSON ऑब्जेक्ट है जिसे मैं पहले एक कुंजी से सॉर्ट करना चाहता हूं, फिर SQL में दो कॉलम द्वारा ऑर्डर करने के समान दूसरी कुंजी द्वारा।दो कुंजी द्वारा JSON ऑब्जेक्ट को ऑर्डर कैसे करें?

{ 
    "GROUPID":3169675, 
    "LASTNAME":"Chantry" 
} 

मैं LASTNAME द्वारा ग्रुप द्वारा सभी परिणाम आदेश और फिर चाहते हैं: यहाँ JSON का एक नमूना मैं होता है। मैंने JSON सॉर्ट फ़ंक्शन का उपयोग एक कुंजी द्वारा क्रमबद्ध करने के लिए किया है लेकिन एकाधिक नहीं।

कोई भी मदद महान होगी।

+1

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

+0

क्या यह JSON ऑब्जेक्ट्स की एक सरणी है? – Castrohenge

उत्तर

9

आप वस्तुओं की एक सरणी है मान लिया जाये कि:

var data = [ 
    { "GROUPID":3169675, "LASTNAME":"Chantry" }, 
    { "GROUPID":3169612, "LASTNAME":"Doe" }, 
    ... 
]; 

आप छंटाई करने के लिए एक कस्टम तुलनित्र उपयोग कर सकते हैं। GROUPID से पहले सॉर्ट करने के लिए, और फिर LASTNAME द्वारा, दो वस्तुओं की तुलना करने के लिए तर्क होगा:

if GROUPID of first is smaller than second 
    return -1; 
else if GROUPID of first is larger than second 
    return 1; 
else if LASTNAME of first is smaller than second 
    return -1; 
else if LASTNAME of first is larger than second 
    return 1; 
else 
    return 0; 

वस्तु सरणी सॉर्ट, उपरोक्त एल्गोरिथ्म का उपयोग करें और सरणी पर तरह विधि कॉल करने के लिए। सॉर्टिंग के बाद, data आवश्यक क्रमबद्ध क्रम में तत्व होना चाहिए।

data.sort(function(a, b) { 
    // compare a and b here using the above algorithm 
}); 

यहां एक और बहुत similar question मैंने हाल ही में उत्तर दिया है। यह jQuery का उपयोग करके एकाधिक कॉलम पर सॉर्ट करने के बारे में है, लेकिन आप आसानी से jQuery भाग को बाहर निकाल सकते हैं। यह कुछ अनुकूलन दृष्टिकोण प्रस्तुत करता है जो कई कॉलम तक बढ़ा सकते हैं।

+0

आप कुंजी की सरणी की तुलना क्यों नहीं करते? यह इस प्रकार को अधिक सामान्य बनाता है या मुझे कुछ याद आती है? नीचे मेरी प्रतिक्रिया देखें। – Mic

+0

@Mic - यह वही है जो मैं लिंक किए गए उत्तर में कर रहा हूं। मैं पूरी चीज को फिर से लिखना नहीं चाहता था, इसलिए बस इसमें एक लिंक जोड़ा। – Anurag

36

यहाँ एकाधिक स्तंभों के साथ वस्तुओं की एक सरणी सॉर्ट करने के लिए एक सामान्य तरीका है,:

var arr = [ 
    { id:5, name:"Name3" }, 
    { id:4, name:"Name1" }, 
    { id:6, name:"Name2" }, 
    { id:3, name:"Name2" } 
], 

// generic comparison function 
cmp = function(x, y){ 
    return x > y ? 1 : x < y ? -1 : 0; 
}; 

//sort name ascending then id descending 
arr.sort(function(a, b){ 
    //note the minus before -cmp, for descending order 
    return cmp( 
     [cmp(a.name, b.name), -cmp(a.id, b.id)], 
     [cmp(b.name, a.name), -cmp(b.id, a.id)] 
    ); 
}); 

, पर सॉर्ट करने के लिए अन्य स्तंभ जोड़ने के लिए आप सरणी तुलना में अन्य मदों जोड़ सकते हैं।

arr.sort(function(a, b){ 
    return cmp( 
     [cmp(a.name, b.name), -cmp(a.id, b.id), cmp(a.other, b.other), ...], 
     [cmp(b.name, a.name), -cmp(b.id, a.id), cmp(b.other, a.other), ...] 
    ); 
}); 

संपादित: नीचे @PhilipZ टिप्पणी प्रति, जे एस में सरणी तुलना comas द्वारा अलग तार में उन्हें बदलने।

+4

मेरी इच्छा है कि मैं आपको एक बैगियन अपवॉट दे सकता हूं .. – Alex

+1

इस उत्तर के लिए एक पर्याप्त है;) यह देखने में खुशी हुई कि इससे आपकी मदद हुई! – Mic

+0

सवाल क्यों सरणी? क्यों न केवल '(a.name - b.name) \t || (a.id - b.id) ' और आप इस तरह जा सकते हैं: ' (a.name - b.name) \t || (ए.आईडी - बी.आईडी) || (ए.आईडी - बी.आईडी) ' –

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