2010-08-12 41 views
9

Hãy nói rằng tôi có một mảngmục chèn trong mảng javascript và sắp xếp

var test = new Array() 

các giá trị trong thử nghiệm là 3,6,9,11,20

nếu tôi sau đó có một biến

var id = 5 

làm cách nào tôi có thể chèn 5 từ 3 đến 6 trong mảng? hoặc tôi chỉ cần chèn nó bất cứ nơi nào và sau đó sắp xếp mảng?

Xin cảm ơn trước.

chỉnh sửa:

Tôi có đoạn mã sau:

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

cho từng hạng mục đưa vào mảng tôi nhận được một cảnh báo với ID nhưng đối với tất cả các mục tôi nhận được một 1 (giá trị chuỗi truy vấn hiện tại), vì vậy cửa sổ bật lên cuối cùng trông giống như 1,1,1,1,1,4,4,6,7,8

Tại sao tôi nhận cửa sổ bật lên mới cho mỗi mục được chèn vào mảng? Tôi nhận được giá trị chuỗi truy vấn một lần cho mỗi mục khác được chèn vào mảng. Tôi phải làm gì để có được một cửa sổ bật lên với mảng hoàn chỉnh?

+0

Bạn có thể chia thành hai câu hỏi riêng biệt thay thế không? Phần thứ hai có vẻ liên quan đến phần đầu tiên, nhưng bạn có thể nhận được câu trả lời tốt hơn theo cách đó. – JAL

Trả lời

17

Bạn có thể sử dụng một searach nhị phân để tìm điểm chèn, nếu mảng của bạn đủ lớn: Dưới đây là một mã nhanh với các bài kiểm tra. (Cảnh báo: không được kiểm tra kỹ lưỡng). Ngoài ra mảng phải là một mảng được sắp xếp. Khi bạn có điểm chèn, chỉ cần sử dụng hàm Array.splice để chèn vào chỉ mục đó.

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

Nếu bạn có các đối tượng khác nhau, điều duy nhất bạn cần làm là cung cấp chức năng so sánh phù hợp.

Hoặc nếu mảng là rất nhỏ và nếu bạn là đặc biệt lười biếng hôm nay, bạn chỉ có thể làm:

test.push (2) .sort();

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

'test.push (2) .sort();' sẽ không hoạt động, vì phương thức 'push' trả về độ dài mới của mảng. Nó nên được thực hiện theo hai bước, ví dụ: 'test.push (2); test.sort(); ':) – CMS

+0

@CMS +1 Bạn đã đúng! không nghĩ về điều đó :) – naikus

+1

Chức năng 'numComparator' của FWIW có thể được đơn giản hóa thành' return val1 - val2'. – James

Các vấn đề liên quan