2011-08-10 72 views
8

Tôi đã đọc câu hỏi này:Loại bỏ một phần tử từ một mảng chỉ định một giá trị trong Javascript

Deleting array elements in JavaScript - delete vs splice

Và có vẻ như cả hai mối nối và xóa đòi hỏi một chỉ số của nguyên tố này để loại bỏ, vậy làm thế nào tôi có thể dễ dàng tìm thấy chỉ mục khi tôi có giá trị không?

Ví dụ nếu tôi có một mảng mà trông như thế này:

["test1", "test2", "test3"] 

và tôi muốn loại bỏ test2. Quá trình tôi đang sử dụng ngay bây giờ, mà tôi hy vọng không phải là cách chính xác để làm điều đó, đang sử dụng $.each kiểm tra giá trị của từng phần tử trong mảng, duy trì bộ đếm thông qua quá trình (được sử dụng làm tham chiếu chỉ mục) và nếu giá trị bằng "test2", thì tôi có chỉ mục của tôi (dưới dạng bộ đếm) và sau đó sử dụng mối nối để loại bỏ nó.

Trong khi mảng phát triển lớn hơn, tôi sẽ tưởng tượng đây sẽ là một quá trình chậm, nhưng tôi có lựa chọn thay thế nào?

+1

Xem 'indexOf' cho những gì bạn muốn. –

+0

Các yếu tố của bạn có thể sắp xếp được không? – VirtualTroll

Trả lời

4

Bạn muốn sử dụng splice() chức năng để loại bỏ các mục, indexOf sẽ tìm thấy nó trong mảng:

Để Tìm một yếu tố cụ thể trong Array: (để biết được loại bỏ)

var index = array.indexOf('test2'); 

Full Ví dụ:

var array = ['test1', 'test2', 'test3']; 
var value_to_remove = 'test2'; 
array.splice(array.indexOf(value_to_remove), 1); 

Working Demo

+0

Anh ấy biết điều đó - anh ấy thậm chí còn nói anh ấy đang sử dụng nó trong câu hỏi. Những gì anh ta muốn biết là làm thế nào để tìm chỉ mục để sử dụng trong 'splice'. –

+0

Cảm ơn bạn josh.trow và Rionmonster! –

+0

Hy vọng nó giải quyết được vấn đề của bạn Pete :) –

0

underscore.js là một chút thư viện thực sự tuyệt vời với rất nhiều chức năng tiện ích tốt. Trong trường hợp này #reject sẽ phù hợp.

http://documentcloud.github.com/underscore/#reject

(Mặc dù phương pháp nội bộ là tất nhiên tương tự như tra cứu chỉ số thủ công của mình và lát/mối nối).

3
var array = ["test1", "test2", "test3"]; 
array.splice(array.indexOf("test2"), 1); 

indexOf (source):
Returns chỉ số đầu tiên mà tại đó một yếu tố nhất định có thể được tìm thấy trong mảng, hoặc -1 nếu nó không phải là hiện tại.

1

Bạn tìm phần tử theo giá trị sử dụng Array#indexOf và sau đó sử dụng chỉ mục kết quả. Lưu ý rằng các trình duyệt cũ hơn có thể không có nó, vì vậy bạn sẽ muốn kiểm tra xem nó có ở đó không và nếu không thêm nó   — here's some code từ MDC thực hiện kiểm tra và thêm chức năng nếu nó không có ở đó.

if (!Array.prototype.indexOf) { 
    Array.prototype.indexOf = function (searchElement /*, fromIndex */) { 
     "use strict"; 
     if (this === void 0 || this === null) { 
      throw new TypeError(); 
     } 
     var t = Object(this); 
     var len = t.length >>> 0; 
     if (len === 0) { 
      return -1; 
     } 
     var n = 0; 
     if (arguments.length > 0) { 
      n = Number(arguments[1]); 
      if (n !== n) { // shortcut for verifying if it's NaN 
       n = 0; 
      } else if (n !== 0 && n !== (1/0) && n !== -(1/0)) { 
       n = (n > 0 || -1) * Math.floor(Math.abs(n)); 
      } 
     } 
     if (n >= len) { 
      return -1; 
     } 
     var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0); 
     for (; k < len; k++) { 
      if (k in t && t[k] === searchElement) { 
       return k; 
      } 
     } 
     return -1; 
    } 
} 

Lưu ý rằng nếu bạn thêm điều cần nguyên mẫu Array như thế, for..in vòng mà cho rằng họ sẽ chỉ nhìn thấy chỉ số mảng (có nghĩa là, incorrect nhưng phổ biến for..in vòng) sẽ bắt đầu gặp vấn đề bởi vì họ sẽ thấy chuỗi "indexOf" khi chúng chỉ mong đợi thấy các chỉ mục mảng, xem this blog post để biết chi tiết.

2

Bạn có thể jQuery $.inArray và thoát khỏi $.each vòng lặp của bạn, và nó hoạt động qua trình duyệt (không giống như Array.indexOf):

var index = $.inArray("test2", ["test1", "test2", "test3"]); // 1 

(Tôi nhận ra câu hỏi của bạn không được gắn thẻ với 'jQuery', nhưng bạn đề cập rằng bạn đã sử dụng vòng lặp $.each).

+0

Điều này thật tuyệt vời, cảm ơn bạn! –

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