2010-08-12 7 views
9

Disons que j'ai un tableauélément d'insertion en javascript tableau et genre

var test = new Array() 

les valeurs test sont 3,6,9,11,20

si je puis une variable

var id = 5 

comment puis-je insérer 5 entre 3 et 6 dans le tableau? ou est-ce que je l'insère juste où et ensuite trier le tableau?

Merci d'avance.

modifier:

je le code suivant:

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); 
}); 

pour chaque élément inséré dans le tableau que je reçois une alerte avec l'ID, mais pour chaque article que je reçois un 1 (la valeur queryString actuelle), donc le dernier pop up ressemble à 1,1,1,1,1,2,4,6,7,8

Pourquoi est-ce que j'obtiens une nouvelle fenêtre pour chaque élément inséré dans la matrice? J'obtiens la valeur querystring une fois pour tous les autres éléments insérés dans le tableau. Que dois-je faire pour obtenir une pop up avec le tableau complet?

+0

Pouvez-vous les séparer en deux questions distinctes? La deuxième partie semble quelque peu liée à la première, mais vous obtiendrez peut-être de meilleures réponses de cette façon. – JAL

Répondre

17

Vous pouvez utiliser une recherche binaire pour trouver un point d'insertion, si votre tableau est assez grand: Vous trouverez ci-dessous un code rapide avec des tests. (Attention: pas complètement testé). Le tableau doit également être un tableau trié. Une fois que vous avez un point d'insertion, utilisez simplement la fonction Array.splice pour l'insérer dans cet index.

/** 
* 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] 

Si vous avez différents objets, la seule chose que vous devez faire est de fournir une fonction de comparateur appropriée.

Ou si le tableau est vraiment petit et si vous êtes particulièrement paresseux aujourd'hui, vous pouvez simplement faire:

test.push (2) .Sort();

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

'test.push (2) .sort();' ne fonctionnerait pas, car la méthode 'push' renvoie la nouvelle longueur du tableau. Cela devrait être fait en deux étapes, par exemple: 'test.push (2); test.sort(); ':) – CMS

+0

@CMS +1 Vous avez raison! n'a pas pensé à ça :) – naikus

+1

FWIW votre fonction 'numComparator' pourrait être simplifiée à' return val1 - val2'. – James

Questions connexes