2010-08-12 88 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); 
}); 

用於插入陣列我得到一個警報,該ID,但對於每一個項目我得到一個1(當前的queryString值的每個項目),所以最後一個彈出窗口看起來像 1,1,1,1,1,2,4,6,7,8

爲什麼我會爲插入到數組中的每個項目都彈出一個新窗口?對於插入到數組中的每個其他項,我都會得到一次querystring值。我需要做些什麼來讓一個彈出完整的數組?

+0

您可以將這些問題分解爲兩個單獨的問題嗎?第二部分似乎與第一部分有些相關,但你可能會得到更好的答案。 – JAL 2010-08-12 05:17:03

回答

17

如果陣列足夠大,可以使用二進制searach查找插入點: 下面是一個包含測試的快速代碼。 (警告:未經徹底測試)。此外,數組必須是一個有序數組。 一旦你有一個插入點,只需使用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 2010-08-12 06:07:40

+0

@CMS +1你是對的!沒有想到:) – naikus 2010-08-12 06:15:43

+1

FWIW你的'numComparator'函數可以簡化爲'return val1 - val2'。 – James 2014-07-22 15:29:17