¿Cómo implementar los métodos array.any()
y array.all()
en Coffeescript?¿Cómo implementar los métodos array.any() y array.all() en Coffeescript?
Respuesta
Esas son realmente parte de Javascript 1.6 y funcionarán igual en CoffeeScript. Quiere some y every.
No sé en qué entorno se encuentra, pero IE < 9 no parece ser compatible con esos métodos. Son bastante fáciles de agregar. Hay un fragmento de código en esas páginas que muestra el código de compatibilidad y si lo desea, puede traducirlo a CoffeeScript, aunque don't have to.
Una forma más cruda, más simple sería (no probado):
if not Array.prototype.some
Array.prototype.some = (f) -> (x for x in @ when f(x)).length > 0
if not Array.prototype.every
Array.prototype.every = (f) -> (x for x in @ when f(x)).length == @length
Pero ninguno de los que tienen lógica de corto circuito. Editar: Pero vea la respuesta de Ricardo para una mejor versión de ellos.
Salida underscore.js, lo que le proporciona _.any
y _.all
métodos (también denominado _.some
y _.every
) que se ejecutarán en cualquier entorno de gran JS. Así es como los que se implementen en CoffeeScript en underscore.coffee:
_.some = (obj, iterator, context) ->
iterator ||= _.identity
return obj.some iterator, context if nativeSome and obj.some is nativeSome
result = false
_.each obj, (value, index, list) ->
_.breakLoop() if (result = iterator.call(context, value, index, list))
result
_.every = (obj, iterator, context) ->
iterator ||= _.identity
return obj.every iterator, context if nativeEvery and obj.every is nativeEvery
result = true
_.each obj, (value, index, list) ->
_.breakLoop() unless (result = result and iterator.call(context, value, index, list))
result
(. Estas dependen de _.each
, que es un método sencillo iteración, y _.breakLoop
, que solo emite una excepción)
cortocircuitado (optimizado versiones):
Array.prototype.some ?= (f) ->
(return true if f x) for x in @
return false
Array.prototype.every ?= (f) ->
(return false if not f x) for x in @
return true
El ?=
es de "asignación existencial", sólo se ejecuta cuando esa propiedad es null
/undefined
.
que estaba buscando en este hoy y decidí poner en práctica all
como un rebaño, y supongo que se podría hacer lo mismo para any
también (pero no lo hace cortocircuito, tampoco):
all = (someArray, predicate) ->
reduceAll = (left, right) ->
return left and right
return [predicate(elem) for elem in someArray].reduce(reduceAll, true)
la no cortocircuitos any
sería su mayoría similares:
reduceAny = (left, right) ->
return left or right
[p(elem) for elem in someArray].reduce(reduceAny, false)
hice all
esta manera porque me pareció que para ser legible. Además, lo hice como una función de libre flotación en lugar de un método de matriz.
- 1. Métodos estáticos y herencia en Coffeescript
- 2. llamar a los métodos súper coffeescript
- 3. Obtener todos los métodos de instancia de un objeto CoffeeScript
- 4. ¿Cómo implementar métodos virtuales en Python?
- 5. ¿Cómo implementar/sobreescribir rápidamente métodos en Eclipse?
- 6. ¿Se pueden implementar los métodos estáticos y los decodificadores de clase en Python puro?
- 7. ¿Cómo se puede escribir CoffeeScript en CoffeeScript?
- 8. ¿Cómo implementar métodos idénticos con 2 y más clases?
- 9. Java: ¿cómo implementar métodos abstractos privados?
- 10. Cómo implementar métodos abreviados de teclado en sitios web
- 11. Implementar métodos parciales en varios ensambles
- 12. CoffeeScript, Knockout y observables
- 13. ¿Cómo implementar correctamente los complementos en C#?
- 14. Cómo implementar automáticamente métodos abstractos heredados en Delphi XE
- 15. ¿Cómo puedo implementar métodos estáticos en una interfaz?
- 16. ¿Cómo implementar comandos para usar métodos ancestrales en WPF?
- 17. CoffeeScript y NodeJS: ¿Cómo exporto varias clases?
- 18. python y usar 'self' en los métodos
- 19. Coffeescript timer y 'this' puntero en callback
- 20. C#, implementar 'resumen estático' como métodos
- 21. Comenzar con Backbone y CoffeeScript
- 22. ¿Cómo se implementan los métodos, `classmethod` y` staticmethod` en Python?
- 23. CoffeeScript Operador existencial y este
- 24. Implementar una interfaz con métodos genéricos
- 25. CoffeeScript: compila todos los archivos .coffee en el directorio actual y en todos los subdirectorios
- 26. ¿Cómo debo manejar los errores en los métodos de Perl y qué debo devolver de los métodos?
- 27. Anulación de los rasgos y los métodos abstractos en Scala
- 28. ¿Cómo usar CoffeeScript y Eclipse juntos en Windows?
- 29. ¿Cómo poner los métodos en conjuntos?
- 30. ¿Cómo puedo ocultar los métodos en F #?
Respuesta perfecta. Solo agregaría que uno puede usar underscore.js para compatibilidad con navegadores más antiguos, como dice la respuesta a continuación. – brandizzi
Es fácil agregar un cortocircuito, y olvidaste '? =', Mira mi respuesta :) –
@Ricardo - Sí, eso es mejor. Además, no sabía? = Truco, así que es bastante limpio. –