2012-08-27 8 views
32

स्पैस सरणी को सॉर्ट करने और तत्वों को उसी इंडेक्स पर रखने का सबसे अच्छा तरीका क्या है? उदाहरण के लिए:जावास्क्रिप्ट सॉर्ट स्पैस सरणी इंडेक्स रखें

a[0] = 3, 
a[1] = 2, 
a[2] = 6, 
a[7] = 4, 
a[8] = 5, 

मैं के बाद तरह

a[0] = 2, 
a[1] = 3, 
a[2] = 4, 
a[7] = 5, 
a[8] = 6. 
+0

शायद तुम कुंजी शब्दों के साथ गूगल की कोशिश कर सकते में: 'प्रकार', 'साहचर्य सरणी', 'मान द्वारा' अगर मैं अच्छी तरह से अपनी समस्या को समझें। – Ricola3D

उत्तर

183

करना चाहते हैं यहाँ एक तरीका है। यह परिभाषित सरणी तत्वों को एक नई सरणी में प्रतिलिपि बनाता है और उनकी अनुक्रमणिका को बचाता है। यह नई सरणी को टाइप करता है और फिर क्रमबद्ध परिणामों को इंडेक्स में वापस रखता है जो पहले इस्तेमाल किए गए थे।

var a = []; 
a[0] = 3; 
a[1] = 2; 
a[2] = 6; 
a[7] = 4; 
a[8] = 5; 


// sortFn is optional array sort callback function, 
// defaults to numeric sort if not passed 
function sortSparseArray(arr, sortFn) { 
    var tempArr = [], indexes = []; 
    for (var i = 0; i < arr.length; i++) { 
     // find all array elements that are not undefined 
     if (arr[i] !== undefined) { 
      tempArr.push(arr[i]); // save value 
      indexes.push(i);   // save index 
     } 
    } 
    // sort values (numeric sort by default) 
    if (!sortFn) { 
     sortFn = function(a,b) { 
      return(a - b); 
     } 
    } 
    tempArr.sort(sortFn); 
    // put sorted values back into the indexes in the original array that were used 
    for (var i = 0; i < indexes.length; i++) { 
     arr[indexes[i]] = tempArr[i]; 
    } 
    return(arr); 
} 

कार्य डेमो: http://jsfiddle.net/jfriend00/3ank4/

+0

सही धन्यवाद काम करता है। – TestersGonnaTest

+0

@ jfriend000, अगर मैं सीधे '.sort()' का उपयोग करता हूं तो क्या होगा? – Jashwant

+0

@Jashwant - यह सरणी में सभी अपरिभाषित धब्बे को अंत तक और सामने के सभी मूल्यों को धक्का देता है जो ओपी ने नहीं पूछा था। आप इसका परिणाम यहां देख सकते हैं: http://jsfiddle.net/jfriend00/UteW2/ – jfriend00

0
var arr = [1,2,3,4,5,6,7,8,9,10]; 
// functions sort 
function sIncrease(i, ii) { // ascending 
if (i > ii) 
return 1; 
else if (i < ii) 
return -1; 
else 
return 0; 
} 
function sDecrease(i, ii) { //descending 
if (i > ii) 
return -1; 
else if (i < ii) 
return 1; 
else 
return 0; 
} 
function sRand() { // random 
return Math.random() > 0.5 ? 1 : -1; 
} 
arr.sort(sIncrease); // return [1,2,3,4,5,6,7,8,9,10] 
arr.sort(sDecrease); // return [10,9,8,7,6,5,4,3,2,1] 
arr.sort(sRand); // return random array for examle [1,10,3,4,8,6,9,2,7,5] 
+3

मुझे नहीं लगता कि यह वही है सवाल वास्तव में पूछ रहा था। – jfriend00

3

आप

  1. उपयोग filter या Object.values अपने विरल सरणी के मूल्यों के साथ एक सरणी प्राप्त करने के लिए कर सकते हैं।
  2. फिर sort उस सरणी, सबसे बड़े से छोटे तक। ध्यान रखें कि यह स्थिर नहीं है, जो विशेष रूप से समस्याग्रस्त हो सकता है यदि कुछ मान संख्यात्मक नहीं हैं। आप अपने स्वयं के सॉर्टिंग कार्यान्वयन का उपयोग कर सकते हैं। वांछित सरणी प्राप्त करने के लिए
  3. map और pop का उपयोग करें। इसे a पर असाइन करें।
var b = a.filter(function(x) { 
    return true; 
}).sort(function(x,y) { 
    return y - x; 
}); 
a = a.map([].pop, b); 

या, ECMAScript 2017,

a = a.map([].pop, Object.values(a).sort((x,y) => y-x)); 
+0

ईएस 5 कोड में परिवर्तनीय 'बी' की आवश्यकता नहीं है, लेकिन मैंने कोड को और अधिक पठनीय बनाने के लिए इसका इस्तेमाल किया। – Oriol

+1

बोनस के रूप में, मूल 'ए' असम्बद्ध है यदि 'नया' एक नए चर पर वापस असाइन करें। अच्छा काम, ओरोल। मुझे डिफ़ॉल्ट रूप से '[] .sort' mutates से नफरत है। – naomik

+0

यदि हम मान सकते हैं कि स्पैस सरणी में सभी तत्व संख्यात्मक हैं (और इस धारणा के बिना सॉर्ट कॉलबैक असंगत व्यवहार करेगा!), तो हम तत्वों को केवल 'a.filter (() => true)' या 'ऑब्जेक्ट' के साथ फ़िल्टर कर सकते हैं .values ​​(क) '। –

0
// Update for your needs ('position' to your key). 

function updateIndexes(list) { 

    list.sort((a, b) => a.position - b.position) 

    list.forEach((_, index, arr) => { 

     arr[ index ].position = index 

    }) 

} 

var myList = [ 
    { position: 8 }, 
    { position: 5 }, 
    { position: 1 }, 
    { position: 9 } 
] 

updateIndexes(myList) 

// Result: 

var myList = [ 
    { position: 1 }, 
    { position: 2 }, 
    { position: 3 }, 
    { position: 4 } 
]