array.select () trong javascript


81

Javascript có chức năng tương tự như Ruby không?

array.select {|x| x > 3}

Cái gì đó như:

array.select(function(x) { if (x > 3)  return true})

Câu trả lời:


134

Array.filter():

var numbers = [1, 2, 3, 4, 5];
var filtered = numbers.filter(function(x) { return x > 3; });

// As a JavaScript 1.8 expression closure
filtered = numbers.filter(function(x) x > 3);

Lưu ý rằng đó Array.filter()không phải là ECMAScript tiêu chuẩn và nó không xuất hiện trong thông số kỹ thuật ECMAScript cũ hơn ES5 (cảm ơn Yi Jiang và jAndy). Do đó, nó có thể không được hỗ trợ bởi các phương ngữ ECMAScript khác như JScript (trên MSIE).

Cập nhật tháng 11 năm 2020 : Array.filter hiện được hỗ trợ trên tất cả các trình duyệt chính.


6

Underscore.js là một thư viện tốt cho các loại hoạt động này - nó sử dụng các thủ tục nội trang như Array.filter nếu có, hoặc sử dụng các thủ tục của chính nó nếu không.

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

Tài liệu sẽ đưa ra ý tưởng về cách sử dụng - cú pháp lambda của javascript không ngắn gọn như ruby ​​hoặc những thứ khác (tôi luôn quên thêm câu lệnh trả về rõ ràng chẳng hạn) và phạm vi là một cách dễ dàng khác để nhận ra, nhưng bạn có thể làm hầu hết mọi thứ khá dễ dàng, ngoại trừ các cấu trúc như hiểu danh sách lười biếng.

Từ tài liệu cho .select () ( .filter () là một bí danh cho cùng một)

Xem qua từng giá trị trong danh sách, trả về một mảng gồm tất cả các giá trị vượt qua kiểm tra sự thật (trình lặp). Đại diện cho phương pháp bộ lọc gốc, nếu nó tồn tại.

  var evens = _.select([1, 2, 3, 4, 5, 6], function(num){ return num % 2 == 0; });
  => [2, 4, 6]

5

bạn có thể mở rộng JS của bạn bằng một phương thức chọn lọc như thế này

Array.prototype.select = function(closure){
    for(var n = 0; n < this.length; n++) {
        if(closure(this[n])){
            return this[n];
        }
    }

    return null;
};

bây giờ bạn có thể sử dụng cái này:

var x = [1,2,3,4];

var a = x.select(function(v) {
    return v == 2;
});

console.log(a);

hoặc cho các đối tượng trong một mảng

var x = [{id: 1, a: true},
    {id: 2, a: true},
    {id: 3, a: true},
    {id: 4, a: true}];

var a = x.select(function(obj) {
    return obj.id = 2;
});

console.log(a);

2
Phương thức của bạn chỉ trả về mục đầu tiên khớp với nó, không trả về một mảng như ruby. Với một thay đổi nhỏ, nó sẽ: Array.prototype.select = function (test) {var new_array = [] for (var n = 0; n <this.length; n ++) {if (test (this [n])) {new_array.push (this [n]); }} trả về new_array; };
Rebekah Waterbury


4

Array.filter không được thực hiện trong nhiều trình duyệt, Tốt hơn là nên xác định hàm này nếu nó không tồn tại.

Mã nguồn của Array.prototype được đăng trong MDN

if (!Array.prototype.filter)
{
  Array.prototype.filter = function(fun /*, thisp */)
  {
    "use strict";

    if (this == null)
      throw new TypeError();

    var t = Object(this);
    var len = t.length >>> 0;
    if (typeof fun != "function")
      throw new TypeError();

    var res = [];
    var thisp = arguments[1];
    for (var i = 0; i < len; i++)
    {
      if (i in t)
      {
        var val = t[i]; // in case fun mutates this
        if (fun.call(thisp, val, i, t))
          res.push(val);
      }
    }

    return res;
  };
}

xem https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter để biết thêm chi tiết


tại kangax.github.io/compat-table/es5/#test-Array.prototype.filter nếu một người chọn "Nền tảng lỗi thời" và sau đó mở rộng "Phương thức mảng", họ sẽ thấy rằng "array.prototype.filter" không được hỗ trợ tại IE8
George Birbilis,
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.