2011-01-29 18 views
33

docs El CoffeeScript estado que las listas por comprensión deben ser capaces de hacer las operaciones de selección/filtro:Filtro con Lista CoffeeScript comprensiones

Ellos deben ser capaces de manejar la mayoría de los lugares donde se habría debido utilizar un bucle , each/forEach, map o select/filter.

Usted se imagina que podría hacer algo en una línea como result = item for item in list if item % 2 == 0 Sin embargo el más cercano que puedo llegar es

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

¿Cuál es la forma más concisa para filtrar una lista en CoffeeScript?

Respuesta

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

edición: añadió result =

+2

poner esto en una función, de lo contrario, no hace nada. Títelo en "Try Coffeescript" en http://jashkenas.github.com/coffee-script/ y mire la salida de javascript. – Amir

+1

No sabía acerca de las cláusulas 'when'. ¡Gracias! –

8

A menos que usted está tratando de exprimir cada gota de rendimiento, me gustaría crear una función de filtro de la siguiente manera:

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

o si desea agréguelo al prototipo de cada matriz:

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

y luego escribir: (respectivamente)

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

o

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

Como referencia, este es el código JavaScript que se genera:

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; 
}); 

Hay una pregunta similar here

+1

Definitivamente es una cuestión de preferencia personal, ya que ambos hacen el trabajo, pero tomando Python como ejemplo, las listas de comprensión son generalmente preferidas sobre las funciones de programación funcional cuando es posible, ya que se consideran más legibles. –

+1

wat. Array ya tiene esta función exacta ... (solo tal vez más eficiente) –

Cuestiones relacionadas