2010-03-25 5 views
6

यह जावास्क्रिप्ट (jQuery) में लागू किया जाएगा, लेकिन मुझे लगता है कि विधि किसी भी भाषा में उपयोग की जा सकती है।मैं सरणी को कैसे क्रमबद्ध कर सकता हूं, फिर भी कुछ तत्वों को छोड़कर (सरणी में एक ही स्थिति में रखा जाना चाहिए)

मेरे पास वस्तुओं की एक श्रृंखला है और मुझे एक प्रकार का प्रदर्शन करने की आवश्यकता है। हालांकि सरणी में कुछ आइटम हैं जिन्हें एक ही स्थिति (उसी सूचकांक) में रखा जाना है।

प्रश्न में सरणी <li> तत्वों की सूची से बनाई गई है और मैं सूची आइटम से जुड़े .data() मानों का उपयोग कर रहा हूं, जिस पर मूल्य को सॉर्ट करना है।

यहां क्या दृष्टिकोण सबसे अच्छा होगा?

<ul id="fruit"> 
    <li class="stay">bananas</li> 
    <li>oranges</li> 
    <li>pears</li> 
    <li>apples</li> 
    <li class="stay">grapes</li> 
    <li>pineapples</li> 
</ul> 

<script type="text/javascript"> 
    var sugarcontent = new Array('32','21','11','45','8','99'); 
    $('#fruit li').each(function(i,e){ 
     $(this).data('sugar',sugarcontent[i]); 
    }) 
</script> 

मैं सूची निम्नलिखित परिणाम के साथ हल कर चाहते हैं ...

<ul id="fruit"> 
     <li class="stay">bananas</li> <!-- score = 32 --> 
     <li>pineapples</li> <!-- score = 99 --> 
     <li>apples</li> <!-- score = 45 --> 
     <li>oranges</li> <!-- score = 21 --> 
     <li class="stay">grapes</li> <!-- score = 8 --> 
     <li>pears</li> <!-- score = 11 --> 
    </ul> 

धन्यवाद!

उत्तर

6

एल्गोरिथ्म है:

  • निकालें और stay
  • मर्ज stay आइटम के साथ चिह्नित नहीं आइटम सॉर्ट और छाँटे गए आइटम

    var sugarcontent = new Array(32, 21, 11, 45, 8, 99); 
    
    var items = $('#fruit li'); 
    
    items.each(function (i) { 
        $(this).data('sugar', sugarcontent[i]); 
        // Show sugar amount in each item text - for debugging purposes 
        if ($(this).hasClass('stay')) 
         $(this).text("s " + $(this).text()); 
        else 
         $(this).text(sugarcontent[i] + " " + $(this).text()); 
    }); 
    
    // Sort sortable items 
    var sorted = $(items).filter(':not(.stay)').sort(function (l, r) { 
        return $(l).data('sugar') - $(r).data('sugar'); 
    }); 
    
    // Merge stay items and sorted items 
    var result = []; 
    var sortedIndex = 0; 
    
    for (var i = 0; i < items.length; i++) 
        if (!$(items[i]).hasClass('stay')) { 
         result.push(sorted[sortedIndex]); 
         sortedIndex++; 
        } 
        else 
         result.push(items[i]); 
    
    // Show result 
    $('#fruit').append(result); 
    
+0

यह वह कोड है जो मेरे साथ समाप्त होने जैसा दिखता है, इसलिए मैंने इसे सही के रूप में चिह्नित किया है - मुझे यकीन है कि petersendidit द्वारा प्रदान किया गया समाधान भी अच्छा है (हालांकि यह अनचाहे है)। धन्यवाद! – calumbrodie

0

के रूप में बेवन ने कहा यह काम नहीं करेगा, लेकिन मैं इसे यहाँ शैक्षिक उद्देश्यों के लिए छोड़ देंगे:

$('#fruit li').sort(function(a, b) { 
    return ($(a).hasClass('stay') || $(b).hasClass('stay')) 
     ? 0 : (a.data('sugar') > b.data('sugar') ? 1 : -1); 
}).appendTo('#fruit'); 

ध्यान दें: आप नाम तर्क के रूप में 'चीनी' के साथ चीनी डेटा निर्धारित करने की आवश्यकता:

.data('sugar', sugarcontent[i]); 
+3

इस दृष्टिकोण के साथ समस्या यह है कि तय आइटम है इस तरह की बाधाएं बनें - एक निश्चित बिंदु से नीचे कोई भी वस्तु कभी ऊपर नहीं चली जाएगी, और इसके विपरीत। – Bevan

+0

सिंटैक्स त्रुटि को इंगित करने के लिए धन्यवाद, मैंने ऊपर अपना उदाहरण कोड तय कर दिया है। – calumbrodie

1

आप यह सोचने में सही हैं कि समाधान सामान्य है और किसी भी विकास पर्यावरण पर लागू होता है।

आपको तत्वों की अपनी सूची को दो अलग-अलग सूचियों में विभाजित करने की आवश्यकता होगी - जिन्हें क्रमबद्ध किया जाना चाहिए, और किसी को जगह में छोड़ा जाना चाहिए। फिर, पहली सूची को सॉर्ट करें और दूसरे के साथ विलय करें।

आपको जिस मुख्य समस्या का सामना करना पड़ रहा है वह यह है: अधिकांश प्रकार के एल्गोरिदम (QuickSort, जो अधिकांश ढांचे में पाए जाने वाले सबसे आम हैं) काफी खराब व्यवहार करते हैं यदि आपका तुलना फ़ंक्शन किसी बाहरी स्थिति पर निर्भर करता है (जैसे आइटम स्थिति)।

+0

क्या मुझे jQuery मर्ज फ़ंक्शन का उपयोग करना चाहिए या सरणी और रिज़ॉर्ट को संयोजित करना चाहिए? इंडेक्स के समान होने पर मैं कैसे सुनिश्चित करूं कि 'निश्चित' आइटमों की मेरी सरणी प्राथमिकता लेती है? आपके द्वारा प्रस्तावित समाधान बिल्कुल ठीक था कि मैंने पहली बार ऐसा करने की कोशिश की लेकिन मैं इसे काम नहीं कर सका। कम से कम मुझे पता है कि मैं सही रास्ते पर था।आपके सहयोग के लिए धन्यवाद! – calumbrodie

+0

@ कॉन्स्टेंटिन द्वारा उत्तर मेरे लिए अच्छा लगता है (मेरा जावास्क्रिप्ट कार्य पर नहीं है। +1) – Bevan

3

यह करना चाहिए:

var sugarcontent = new Array('32','21','11','45','8','99'); 
var list = $('#fruit'); 
var lis = list.find('li').each(function(i,e){ 
    $(this).data('score',sugarcontent[i]); 
}); 
var stay = lis.filter('.stay').each(function(){ 
    $(this).data('index',$(this).index()); 
}); 
lis.sort(function(a,b){ 
    return $(b).data('score') - $(a).data('score'); 
}).appendTo(list); 
stay.each(function(){ 
    var index = $(this).data('index'); 
    if (index == 0) { 
     list.prepend(this); 
    } else { 
     lis.filter(':eq('+index+')').insertAfter(this); 
    } 
} 

इस वर्ग के रहने के साथ वस्तुओं के सूचकांक कैश और फिर इसे स्कोर के आधार पर चुनना करता है और उसके बाद की जगह वर्ग के साथ आइटम सही जगह पर वापस रहते हैं।

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

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