2009-09-02 11 views
8

ठीक है, मैं वर्णमाला क्रम में एक XMLListCollection सॉर्ट कर रहा हूँ। हालांकि मेरे पास एक मुद्दा है। यदि मान "सब" है, तो मैं इसे सूची में सबसे पहले रखना चाहता हूं। ज्यादातर मामलों में यह पहले से ही होता है लेकिन संख्याएं जो संख्याएं हैं "सभी" से पहले क्रमबद्ध की जा रही हैं। मैं चाहता हूं कि "सभी" हमेशा मेरे डेटाप्रोवाइडर और फिर बाकी वर्णमाला में पहला चयन करें।फ्लेक्स: क्रमबद्ध करें - एक कस्टम तुलना लिखना समारोह?

तो मैं अपना खुद का सॉर्ट फ़ंक्शन लिखने की कोशिश कर रहा हूं। क्या कोई तरीका है कि मैं जांच सकता हूं कि मूल्यों में से कोई एक है या नहीं, और यदि मूल्यों पर नियमित तुलना करने के लिए यह नहीं कहा जाता है?

function myCompare(a:Object, b:Object, fields:Array = null):int 
{ 
    if(String(a).toLowerCase() == 'all') 
    { 
     return -1; 
    } 
    else 
     if(String(b).toLowerCase() == 'all') 
     { 
      return 1; 
     } 
    // NEED to return default comparison results here? 
} 

//------------------------------ 

var sort:Sort = new Sort(); 
sort.compareFunction = myCompare; 

वहाँ मुझे क्या करना है कोशिश कर रहा हूँ के लिए एक समाधान है:

यहाँ मैं क्या किया है?

+0

क्या होगा यदि दोनों' सब 'हैं? –

+0

मैं कहना चाहूंगा कि ऐसा कभी नहीं होगा। लेकिन हाँ मुझे पता है कि कभी भी मामला नहीं है। यदि वे जांच के लिए हाथ से पहले कथन देते हैं तो मैं एक और जोड़ दूंगा और वापसी 0 सच है। धन्यवाद। –

उत्तर

8

वैसे मैंने कुछ कोशिश की, और मैं वास्तव में आश्चर्यचकित हूं कि यह वास्तव में काम करता है, लेकिन यहां मैंने जो किया है।

सॉर्ट क्लास में एक निजी फ़ंक्शन है जिसे आंतरिक कॉम्पैयर कहा जाता है। चूंकि यह निजी है आप इसे कॉल नहीं कर सकते हैं। लेकिन तुलनात्मक नामक एक गेटर फ़ंक्शन है, और यदि कोई तुलना फ़ंक्शन परिभाषित नहीं किया गया है तो यह आंतरिक कॉम्पैयर फ़ंक्शन का संदर्भ देता है। तो मैंने जो किया वह इस संदर्भ को मिला और फिर इसे बुलाया।

private function myCompare(a:Object, b:Object, fields:Array = null):int 
{ 
    if(String(a).toLowerCase() == 'all') 
    { 
     return -1; 
    } 
    else if(String(b).toLowerCase() == 'all') 
    { 
     return 1; 
    } 
    // NEED to return default comparison results here? 
    var s:Sort = new Sort(); 
    var f:Function = s.compareFunction; 
    return f.call(null,a,b,fields); 
} 
+1

आप कक्षा के एक उदाहरण या स्थिर सदस्य को भी बनाने में सक्षम हो सकते हैं, इसलिए जब भी तुलना की जाती है तो आपको एक नया प्रकार बनाने की आवश्यकता नहीं होती है। –

+0

@ कैथी, अच्छा बिंदु। –

+0

अच्छा, अच्छा मणि :) – Tox

14

जॉन Isaacks से समाधान भयानक है, लेकिन वह "फील्ड" के बारे में भूल चर और उसके उदाहरण (स्ट्रिंग्स के अलावा अन्य) और अधिक जटिल वस्तुओं के लिए काम नहीं करता है

उदाहरण:

// collection with custom objects. We want to sort them on "value" property 
// var item:CustomObject = new CustomObject(); 
// item.name = 'Test'; 
// item.value = 'Simple Value'; 

var collection:ArrayCollection = new ArrayCollection(); 
var s:Sort = new Sort(); 
s.fields = [new SortField("value")]; 
s.compareFunction = myCompare; 
collection.sort = s; 
collection.refresh(); 

private function myCompare(a:Object, b:Object, fields:Array = null):int 
{ 
    if(String((a as CustomObject).value).toLowerCase() == 'all') 
    { 
     return -1; 
    } 
    else if(String((b as CustomObject).value).toLowerCase() == 'all') 
    { 
     return 1; 
    } 
    // NEED to return default comparison results here? 
    var s:Sort = new Sort(); 
    s.fields = fields; 
    var f:Function = s.compareFunction; 
    return f.call(null,a,b,fields); 
} 
+0

पहली नज़र में मैंने सोचा कि आप गलत थे लेकिन पता चला कि एडोब एक बार फिर खराब हो गया। उनके आंतरिक कॉम्पैयर फ़ंक्शन फ़ंक्शन पैरामीटर की बजाय इंस्टेंस फ़ील्ड के लिए चेक करता है। फिर भी एडोब के रत्नों में से एक ... –

+0

यह बहुत उपयोगी था। मैंने इसके बजाय String.localeCompare() का उपयोग करने का प्रयास किया, लेकिन इसमें सॉर्टिंग के कुछ दुष्प्रभाव होते हैं जिन्हें अक्सर कहा जाता है –

0

धन्यवाद दोस्तों, इससे बहुत मदद मिली। हमारे मामले में, हमें नीचे सभी खाली पंक्तियों (डेटाग्रिड में) की आवश्यकता थी। सभी गैर-खाली पंक्तियों को सामान्य रूप से क्रमबद्ध किया जाना चाहिए। हमारा पंक्ति डेटा सभी गतिशील ऑब्जेक्ट्स (जेएसओएन से कनवर्ट किया गया है) - सत्यापन के लिए कॉल हेल्पर.hasData() बस यह जांचता है कि पंक्ति खाली है या नहीं। मेरी स्थिति, alphabetize लिए किया गया था, जिसके लिए काम करने के लिए

private function compareEmptyAlwaysLast(a:Object, b:Object, fields:Array = null):int { 
    var result:int; 
    if (!ValidationHelper.hasData(a)) { 
     result = 1; 
    } else if (!ValidationHelper.hasData(b)) { 
     result = -1; 
    } else { 
     if (fields && fields.length > 0 && fields[0] is SortField) { 
      STATIC_SORT.fields = fields; 
     } 
     var f:Function = STATIC_SORT.compareFunction; 
     result = f.call(null,a,b,fields); 
    } 
    return result; 
} 
-1

मैं इन तरीकों नहीं मिला: किसी कारण से खेतों कभी कभी SortFields के बजाय dataField स्ट्रिंग मान, 'खाने' संपत्ति सेट करने से पहले इसलिए जांच शामिल स्ट्रिंग्स की एक सूची और फिर सूची के अंत में 'नया बनाएं ...' आइटम संलग्न करें।

जिस तरह से मैंने चीजों को संभाला है वह थोड़ा सा सुरुचिपूर्ण है, लेकिन विश्वसनीय है।

मैं हल कर मेरी स्ट्रिंग्स की ArrayCollection, orgNameListकहा जाता है, एक अल्फा प्रकार के साथ है, तो जैसे:

var alphaSort:Sort = new Sort(); 
    alphaSort.fields = [new SortField(null, true)]; 
    orgNameList.sort = alphaSort; 
    orgNameList.refresh(); 

तो मैं एक नया ArrayCollection में क्रमबद्ध सूची के तत्वों की नकल की, customerDataList कहा जाता है। परिणाम यह है कि तत्वों के नए ArrayCollection वर्णमाला क्रम में हैं, लेकिन Sort ऑब्जेक्ट के प्रभाव में नहीं हैं। इसलिए, एक नया तत्व जोड़ना इसे ArrayCollection के अंत में जोड़ देगा। इसी प्रकार, ArrayCollection में किसी विशेष इंडेक्स में कोई आइटम जोड़ना भी अपेक्षित काम करेगा।

for each(var org:String in orgNameList) 
    { 
     customerDataList.addItem(org); 
    } 

तब मैंने बस 'नया बनाएं' पर काम किया ...'आइटम, इस तरह:

if(userIsAllowedToCreateNewCustomer) 
    { 
     customerDataList.addItem(CREATE_NEW); 
     customerDataList.refresh(); 
    } 
संबंधित मुद्दे