2013-04-14 78 views
18

Tôi đã tự hỏi làm thế nào tôi muốn đi về việc thực hiện một phương pháp trong javascript mà loại bỏ tất cả các yếu tố của một mảng rõ ràng một điều kiện nhất định. (Tốt hơn là không sử dụng jQuery)javascript - loại bỏ phần tử mảng trên điều kiện

Ví dụ:

ar = [ 1, 2, 3, 4 ]; 
ar.removeIf(function(item, idx) { 
    return item > 3; 
}); 

Ở trên sẽ đi qua từng mục trong mảng và loại bỏ tất cả các mục trong số đó return true cho điều kiện (trong ví dụ, mục> 3).

Tôi chỉ mới bắt đầu bằng javascript và tự hỏi liệu có ai biết một cách hiệu quả ngắn để thực hiện việc này hay không.

- cập nhật -

Nó cũng sẽ là tuyệt vời nếu tình trạng này có thể làm việc trên các thuộc tính đối tượng là tốt.

Ví dụ:

ar = [ {num:1, str:"a"}, {num:2, str:"b"}, {num:3, str:"c"} ]; 
ar.removeIf(function(item, idx) { 
    return item.str == "c"; 
}); 

Trường hợp mục sẽ được loại bỏ nếu item.str == "c"

- Update2 -

Nó sẽ được tốt đẹp nếu điều kiện chỉ số có thể làm việc là tốt.

Ví dụ:

ar = [ {num:1, str:"a"}, {num:2, str:"b"}, {num:3, str:"c"} ]; 
ar.removeIf(function(item, idx) { 
    return idx == 2; 
}); 

Trả lời

19

Bạn có thể thêm phương pháp của riêng bạn để Array rằng làm điều gì đó tương tự, nếu filter không làm việc cho bạn.

Array.prototype.removeIf = function(callback) { 
    var i = 0; 
    while (i < this.length) { 
     if (callback(this[i], i)) { 
      this.splice(i, 1); 
     } 
     else { 
      ++i; 
     } 
    } 
}; 

Với tôi, đó là một trong những tính năng thú vị nhất của JavaScript. Ian chỉ ra một cách hiệu quả hơn để làm điều tương tự. Xét rằng đó là JavaScript, mỗi bit giúp:

Array.prototype.removeIf = function(callback) { 
    var i = this.length; 
    while (i--) { 
     if (callback(this[i], i)) { 
      this.splice(i, 1); 
     } 
    } 
}; 

Điều này tránh sự cần thiết phải thậm chí lo lắng về việc cập nhật length hoặc bắt các mục tiếp theo, khi bạn làm việc theo cách của bạn còn hơn là phải.

+0

http://jsfiddle.net/n8JEy/3/ Những công việc này. – pickypg

+0

Cảm ơn, hoạt động tuyệt vời. Tôi thích cách này sẽ xem xét các chỉ số thay đổi thông qua nối trong quá trình lặp. – dk123

+3

Đó là một chút lộn xộn. Hãy thử http://jsfiddle.net/n8JEy/4/ - và bạn đã không chuyển 'i' đến hàm gọi lại làm tham số thứ hai – Ian

14

Bạn có thể sử dụng Array.filter(), mà làm điều ngược lại:

ar.filter(function(item, idx) { 
    return item <= 3; 
}); 
+2

Như lên của một người đứng đầu không được hỗ trợ trong IE8 hoặc thấp hơn. Bạn cũng nên phủ nhận biểu thức gốc, hoặc nó phải là '<='. – pickypg

+5

Không Array.filter() trả về một mảng mới với các phần tử đã lọc? Có cái gì đó chỉ cần loại bỏ các yếu tố từ mảng? – dk123

+0

@ dk123: Không có gì được tạo trước. Bạn sẽ phải viết một vòng lặp 'for'., – Blender

19

Bạn có thể sử dụng Array filter method.

Mã này sẽ trông như thế này:

ar = [ 1, 2, 3, 4 ]; 
ar = ar.filter(function(item) { 
    return !(item > 3); 
}); 
1

Tôi thích các loại câu hỏi này và chỉ là một phiên bản khác của tôi ...:)

Array.prototype.removeIf = function(expression) { 
    var res = []; 
    for(var idx=0; idx<this.length; idx++) 
    { 
     var currentItem = this[idx]; 
     if(!expression(currentItem)) 
     { 
      res.push(currentItem); 
     } 
    } 
    return res; 
} 

ar = [ 1, 2, 3, 4 ]; 
var result = ar.removeIf(expCallBack); 


console.log(result); 
function expCallBack(item) 
{ 
    return item > 3; 
} 
+0

Bạn có thể sửa đổi (hoặc thêm một phương thức khác) mã của bạn một chút để thực sự loại bỏ các phần tử thay vì trả về một mảng mới không? Cảm ơn vi đa trả lơi. – dk123

+2

bất cứ ai downvoted này sai. đây là câu trả lời tuyệt vời nhất của tất cả chúng. kiểm tra bài kiểm tra bằng @Blender jsperf.com/splice-vs-filter. nó nhanh hơn gấp 2 lần và nhanh hơn 15 lần so với phiên bản Firefox mới nhất – parliament

2

chỉ đơn giản là viết các ví dụ sau nếu tình trạng có thể làm việc trên các thuộc tính đối tượng cũng

var ar = [ {num:1, str:"a"}, {num:2, str:"b"}, {num:3, str:"c"} ]; 
var newArray = []; 
for (var i = 0, len = ar.length; i<len; i++) { 
     if (ar[i].str == "b") 
     {newArray.push(ar[i]);}; 
}; 
console.log(newArray); 

Xem ví dụ Live Example

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