假设我有一个数组
var test = new Array()
测试中的值为3,6,9,11,20
如果我有变量
var id = 5
如何在阵列中的3和6之间插入5? 或者我只是在任何地方插入它然后对数组进行排序?
提前致谢。
编辑:
我有以下代码:
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
为什么我会为插入阵列的每个项目弹出一个新的弹出窗口?我为插入到数组中的每个其他项获取一次查询字符串值。如何弹出一个完整的数组呢?
答案 0 :(得分: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();