2012-02-15 37 views
16

Tôi đang cố gắng thực hiện một hàm removeAll(), điều này sẽ loại bỏ tất cả các phần tử của một mảng với giá trị cụ thể đó (không phải chỉ mục).Làm thế nào để xóa nhiều mục của một mảng theo giá trị?

Phần khó khăn xảy ra khi chúng tôi thực hiện bất kỳ thay đổi nào đối với vòng lặp, các chỉ mục có xu hướng di chuyển xung quanh (làm cho nó rất khó để làm cho nó hoạt động như chúng tôi muốn) và khởi động lại vòng lặp mỗi khi chúng tôi thực hiện thay đổi là rất không hiệu quả mảng lớn.

Cho đến nay, tôi đã viết riêng arr.indexOf chức năng của tôi (đối với hỗ trợ trình duyệt IE cũ), nó trông như thế này:

function arrFind(val, arr) { 
    for (var i = 0, len = arr.length, rtn = -1; i < len; i++) { 
     if (arr[i] === val) { 
      return i; 
     } 
    } 
    return -1; 
} 

Nó rất dễ dàng để loại bỏ các yếu tố như thế này:

var myarray = [0, 1, 2, 3, 4]; 
var tofind = 2; 

var stored_index = arrFind(tofind, myarray); 
if (stored_index != -1) { 
    myarray.splice(stored_index, 1); 
} 

alert(myarray.join(",")); //0,1,3,4 

Tuy nhiên, như tôi đã chỉ ra trước đó, khi làm điều này trong khi lặp lại, chúng tôi gặp rắc rối.

Bất kỳ ý tưởng nào về cách xóa các mục mảng đúng cách trong khi lặp qua nó?

+0

[thấy câu hỏi có liên quan này] (http://stackoverflow.com/q/3954438/908879) (nhưng là _not_ một dup vì câu hỏi của tôi là về _a problem_ khi tháo _multiple_ mục _inside một loop_) – ajax333221

Trả lời

42

Lặp lại theo thứ tự ngược hoặc tạo một mảng mới với các mục không bị xóa.

+0

xây dựng một mảng mới chỉ với các mục là '! =' với một mục mà tôi muốn xóa là một ý tưởng hay !, Tôi sẽ làm điều này. – ajax333221

+10

'Lặp lại theo thứ tự' - * facepalm * - cảm ơn nhiều! –

+0

Bạn là một anh hùng chết tiệt !! – svarog

22

Mỗi trình duyệt mới có một phương pháp Mảng lọc:

var myarray=[0,1,2,3,4]; 
var removal=2; 
var newarray=myarray.filter(function(itm){return itm!==removal}); 
1

tôi đã viết chức năng này ít nơi arr là mảng gốc và d1, d2 các giá trị bạn muốn xóa. Tôi tự hỏi làm thế nào nó có thể được tổng quát thành một số lượng tùy ý các giá trị được loại bỏ. Vâng, tôi chỉ là người mới bắt đầu.

function destroyer(arr, d1, d2) { 
    var lean =[]; 
    for (var i = 0; i<arr.length; i++) { 
     if (arr[i] != d1 && arr[i] != d2) { 
      lean.push(arr[i]); 
     } 
    } 
    return lean; 
4

Hãy thử cái này. Bạn chỉ cần kiểm tra các chỉ mục của các số bạn muốn xóa. Tôi đã thêm các phần tử bổ sung trong mảng của bạn.

var myarray = [0, 1, 2, 3, 2, 2, 2, 5, 6]; 
var indicesToRemove = new Array(); 

for(i=0;i<myarray.length;i++){ 
    if(myarray[i]===2){ //let's say u wud like to remove all 2 
     indicesToRemove.push(i); //getting the indices and pushing it in a new array 
    } 
} 

for (var j = indicesToRemove.length -1; j >= 0; j--){ 
    myarray.splice(indicesToRemove[j],1); 
} 

alert(JSON.stringify(myarray)); //myarray will be [0,1,3,5,6] 
+1

Câu trả lời này tốt hơn câu trả lời được chấp nhận bởi vì nó có mã và thực sự bảo tồn thứ tự xóa. –

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