2010-10-25 36 views
31

thể trùng lặp:
Javascript swap array elementsViệc trao đổi hai mục trong một mảng javascript

Tôi có một mảng như thế này:

this.myArray = [0,1,2,3,4,5,6,7,8,9]; 

Bây giờ những gì tôi muốn làm là, vị trí hoán đổi của hai mục cho vị trí của chúng. Ví dụ, tôi muốn trao đổi mục 4 (đó là 3) với mục 8 (đó là 7) nào nên kết quả trong:

this.myArray = [0,1,2,7,4,5,6,3,8,9]; 

Làm thế nào tôi có thể đạt được điều này?

+2

Duplicate (với một số giải pháp thái quá để giải trí của bạn) - http://stackoverflow.com/questions/872310/javascript-swap-array-elements –

Trả lời

50

Chỉ cần phân công lại các yếu tố, tạo ra một biến trung gian để tiết kiệm đầu tiên bạn quá viết:

var swapArrayElements = function(arr, indexA, indexB) { 
    var temp = arr[indexA]; 
    arr[indexA] = arr[indexB]; 
    arr[indexB] = temp; 
}; 
// You would use this like: swapArrayElements(myArray, 3, 7); 

Nếu bạn muốn chắc này dễ dàng hơn để sử dụng, bạn có thể thậm chí thêm video này vào Array mẫu dựng sẵn (như kennebec @ gợi ý); Tuy nhiên, lưu ý rằng đây thường là một mô hình xấu để tránh (vì điều này có thể tạo ra các vấn đề khi nhiều thư viện khác nhau có những ý tưởng khác nhau về những gì thuộc về các loại BUILTIN):

Array.prototype.swap = function(indexA, indexB) { 
    swapArrayElements(this, indexA, indexB); 
}; 
// You would use this like myArray.swap(3, 7); 

Lưu ý rằng giải pháp này là hiệu quả hơn đáng kể thay vì sử dụng mối nối(). (O (1) so với O (n)).

+9

O (1) dưới đây không phải là – Nick

5

Bạn chỉ có thể sử dụng một biến tạm để di chuyển những thứ xung quanh, ví dụ:

var temp = this.myArray[3]; 
this.myArray[3] = this.myArray[7]; 
this.myArray[7] = temp; 

You can test it out here, hoặc dưới hình thức chức năng:

Array.prototype.swap = function(a, b) { 
    var temp = this[a]; 
    this[a] = this[b]; 
    this[b] = temp; 
}; 

Sau đó, bạn sẽ chỉ cần gọi nó như thế này:

this.myArray.swap(3, 7); 

You can test that version here.

75

Giá trị trả về từ một mối nối là yếu tố (s) đó là removed-

không cần một biến temp

Array.prototype.swapItems = function(a, b){ 
    this[a] = this.splice(b, 1, this[a])[0]; 
    return this; 
} 

var arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; 

alert(arr.swapItems(3, 7)); 

giá trị trả: (Mảng)

0,1,2,7,4,5,6,3,8,9 
+1

Tốt đẹp !! Làm thế nào mà không ai khác đã bỏ phiếu cho câu trả lời này. – zachzurn

+0

Chìa khóa để hiểu rằng giải pháp là mối nối() có thể có các mục bổ sung sau khi bắt đầu và deleteCount sẽ được chèn vào vị trí nối. Chỉ có một nhược điểm: splice() trả về một mảng, do đó, để lấy phần tử (và duy nhất) từ mảng đó, người ta sẽ phải nói: 'this [a] = this.splice (b, 1, this [a]) [0]; ' – trembl

+13

Cân nhắc điều này, mối nối là O (n), http://stackoverflow.com/questions/11514308/big-o-of-javascript-arrays – Nick

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