2010-08-12 11 views
9

Sagen wir, ich habe ein ArrayEinsatz Artikel in JavaScript-Array und sortieren

var test = new Array() 

die Werte in Test sind 3,6,9,11,20

wenn ich dann eine Variable

var id = 5 

Wie kann ich 5 zwischen 3 und 6 in das Array einfügen? oder kann ich es einfach überall einfügen und dann das Array sortieren?

Vielen Dank im Voraus.

edit:

Ich habe den folgenden Code:

function gup(filter) 
{ 
    filter = filter.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]"); 
    var regexS = "[\\?&]"+filter+"=([^&#]*)"; 
    var regex = new RegExp(regexS); 
    var results = regex.exec(window.location.href); 
    if(results == null) 
    return ""; 
    else 
    return results[1]; 
} 

var queryString = gup("SelectedID"); 


var hrefs = new Array(); 
$('.table404').children().children().each(function(){ 
var link = ($(this).find('a').attr('href')); 
var startIndex = link.indexOf(",'"); 
var endIndex = link.indexOf("');"); 
if (startIndex >= 0 && endIndex >= 0) { 
var linkID = link.substring(startIndex+2, endIndex); 
hrefs.push(linkID); 
hrefs.push(queryString); 
hrefs.sort() 
} 
alert(hrefs); 
}); 

für jedes Element in das Array eingefügt ich eine Benachrichtigung mit der ID erhalten, aber für jedes Element erhalte ich einen 1 (der aktuellen querystring Wert), so sieht das letzte Pop-up etwas wie 1,1,1,1,1,2,4,6,7,8

Warum bekomme ich ein neues Pop-up für jedes Element in das Array eingefügt? Ich erhalte den Querystring-Wert einmal für jedes andere in das Array eingefügte Element. Was muss ich tun, um ein Popup mit dem kompletten Array zu erhalten?

+0

Können Sie diese in zwei separate Fragen statt brechen? Der zweite Teil scheint etwas mit dem ersten zu tun zu haben, aber Sie könnten auf diese Weise bessere Antworten erhalten. – JAL

Antwort

17

Sie können eine binäre Searach verwenden, um einen Einfügepunkt zu finden, wenn Ihr Array groß genug ist: Unten finden Sie einen schnellen Code mit Tests. (Achtung: nicht gründlich getestet). Auch das Array muss ein sortiertes Array sein. Sobald Sie einen Einfügepunkt haben, verwenden Sie einfach die Array.splice-Funktion, um diesen Index einzufügen.

/** 
* Find insertion point for a value val, as specified by the comparator 
* (a function) 
* @param sortedArr The sorted array 
* @param val The value for which to find an insertion point (index) in the array 
* @param comparator The comparator function to compare two values 
*/ 
function findInsertionPoint(sortedArr, val, comparator) { 
    var low = 0, high = sortedArr.length; 
    var mid = -1, c = 0; 
    while(low < high) { 
     mid = parseInt((low + high)/2); 
     c = comparator(sortedArr[mid], val); 
     if(c < 0) { 
     low = mid + 1; 
     }else if(c > 0) { 
     high = mid; 
     }else { 
     return mid; 
     } 
     //alert("mid=" + mid + ", c=" + c + ", low=" + low + ", high=" + high); 
    } 
    return low; 
} 

/** 
* A simple number comparator 
*/ 
function numComparator(val1, val2) { 
    // Suggested b @James 
    return val1 - val2; 
} 

// TESTS -------------------------------- 

var arr = [0,1,3,6,9,11,20]; 
var idx = findInsertionPoint(arr, 2, numComparator); 
arr.splice(idx, 0, 2); 
alert(arr); // will alert [0,1,2,3,6,9,11,20] 

var arr2 = [0,1,3,6,9,11,20]; 
var idx2 = findInsertionPoint(arr2, -1, numComparator); 
arr2.splice(idx2, 0, -1); 
alert(arr2); // will alert [-1,0,1,3,6,9,11,20] 

Wenn Sie verschiedene Objekte haben, müssen Sie nur eine entsprechende Komparatorfunktion bereitstellen.

Oder, wenn das Array sehr klein ist, und wenn Sie heute besonders faul, können Sie einfach tun:

test.push (2) .Sort();

test.push(2); test.sort(); 
+5

'test.push (2) .sort();' würde nicht funktionieren, da die Methode 'push' die neue Länge des Arrays zurückgibt. Dies sollte in zwei Schritten erfolgen, beispielsweise: test.push (2); test.sort(); ':) – CMS

+0

@CMS +1 Sie haben Recht! habe nicht darüber nachgedacht :) – naikus

+1

FWIW Deine 'numComparator' Funktion könnte vereinfacht werden zu' return val1 - val2'. – James

Verwandte Themen