2011-01-29 42 views
33

docs Các CoffeeScript nêu rằng comprehensions danh sách sẽ có thể thực hiện các tác chọn/lọc:Lọc với danh sách comprehensions CoffeeScript

Họ sẽ có thể xử lý hầu hết những nơi mà bạn nếu không sẽ sử dụng một vòng lặp , mỗi/forEach, bản đồ hoặc chọn/lọc.

Bạn muốn tưởng tượng bạn có thể làm một cái gì đó trong một dòng như result = item for item in list if item % 2 == 0 Tuy nhiên gần nhất tôi có thể đến là

list = [1,2,3,4] 
result = [] 
for item in list 
    if item % 2 == 0 then result.push item 

Whats cách ngắn gọn nhất để lọc danh sách trong CoffeeScript?

Trả lời

75
result = (item for item in list when item % 2 == 0) 

chỉnh sửa: thêm result =

+2

Đặt rằng trong một hàm, nếu không, nó không làm gì. Nhập nó vào "Thử Coffeescript" trong http://jashkenas.github.com/coffee-script/ và nhìn vào đầu ra javascript. – Amir

+1

Không biết về mệnh đề 'khi'. Cảm ơn! –

8

Trừ khi bạn đang cố gắng bóp mỗi ounce của hiệu suất ra ngoài, tôi sẽ tạo ra một chức năng lọc như thế này:

filter = (list, func) -> x for x in list when func(x) 

hoặc nếu bạn muốn thêm nó vào nguyên mẫu của mỗi mảng:

Array::filter = (func) -> x for x in @ when func(x) 

và sau đó viết: (tương ứng)

result = filter mylist, (x) -> x % 2 == 0 

hoặc

result = mylist.filter (x) -> x % 2 == 0 

Để tham khảo, đây là javascript đó được tạo ra:

var filter, result; 
filter = function(list, func) { 
    var x, _i, _len, _results; 
    _results = []; 
    for (_i = 0, _len = list.length; _i < _len; _i++) { 
     x = list[_i]; 
     if (func(x)) { 
      _results.push(x); 
     } 
    } 
    return _results; 
}; 
Array.prototype.filter = function(func) { 
    var x, _i, _len, _results; 
    _results = []; 
    for (_i = 0, _len = this.length; _i < _len; _i++) { 
     x = this[_i]; 
     if (func(x)) { 
      _results.push(x); 
     } 
    } 
    return _results; 
}; 
result = filter(mylist, function(x) { 
    return x % 2 === 0; 
}); 
result = mylist.filter(function(x) { 
    return x % 2 === 0; 
}); 

Có một câu hỏi tương tự here

+1

Đó chắc chắn là vấn đề sở thích cá nhân vì cả hai đều hoàn thành công việc - nhưng lấy python làm ví dụ, việc hiểu danh sách thường được ưu tiên hơn chức năng lập trình hàm khi có thể vì chúng được coi là dễ đọc hơn. –

+1

wat. Mảng đã có chức năng chính xác này ... (chỉ có thể hiệu quả hơn) –

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