2010-08-12 2 views
9

Скажем, у меня есть массиввставки элемента в массиве яваскрипта и сортировки

var test = new Array() 

значения в тесте 3,6,9,11,20

если я потом иметь переменную

var id = 5 

Как я могу вставить 5 между 3 и 6 в массиве? или я просто вставляю его везде, а затем сортирую массив?

Заранее спасибо.

редактировать:

У меня есть следующий код:

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

для каждого элемента, вставленного в массив, я получаю предупреждение с идентификатором, но для каждого элемента я получаю один 1 (текущее значение QueryString), поэтому последнее всплывающее окно выглядит примерно так: 1,1,1,1,1,2,4,6,7,8

Почему я получаю всплывающее окно для каждого элемента, вставленного в массив? Я получаю значение querystring один раз для каждого другого элемента, вставленного в массив. Что мне нужно сделать, чтобы получить всплывающее окно с полным массивом?

+0

Вы можете разбить их на два отдельных вопроса? Вторая часть кажется несколько связанной с первой, но вы можете получить более точные ответы. – JAL

ответ

17

Вы можете использовать бинарный поиск, чтобы найти точку вставки, если массив достаточно велик: Ниже приведен быстрый код с тестами. (Предупреждение: не проверено полностью). Также массив должен быть отсортированным массивом. Как только у вас есть точка вставки, просто используйте функцию Array.splice для вставки в этот индекс.

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

Если у вас есть разные объекты, единственное, что вам нужно сделать, это предоставить соответствующую функцию компаратора.

Или, если массив действительно мало, и если вы особенно ленивый сегодня, вы можете просто сделать:

test.push (2) .sort();

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

'test.push (2) .sort();' не будет работать, поскольку метод 'push' возвращает новую длину массива. Это должно быть сделано в два этапа, например: 'test.push (2); test.sort(); ':) – CMS

+0

@CMS +1 Вы правы! не думал об этом :) – naikus

+1

FWIW ваша функция 'numComparator' может быть упрощена для возврата val1 - val2'. – James

Смежные вопросы