在javascript数组中插入项目并排序

时间:2010-08-12 04:48:05

标签: javascript

假设我有一个数组

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

为什么我会为插入阵列的每个项目弹出一个新的弹出窗口?我为插入到数组中的每个其他项获取一次查询字符串值。如何弹出一个完整的数组呢?

1 个答案:

答案 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();