2011-08-23 4 views

Respuesta

17

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.

+0

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

+0

Es fácil agregar un cortocircuito, y olvidaste '? =', Mira mi respuesta :) –

+0

@Ricardo - Sí, eso es mejor. Además, no sabía? = Truco, así que es bastante limpio. –

5

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)

12

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.

0

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.

Cuestiones relacionadas