2012-06-21 18 views
5

Sto utilizzando il seguente codice nel CoffeeScript:Utilizzando indexOf in CoffeeScript

if elem in my_array 
    do_something() 

che compila a questo javascript:

if (__indexOf.call(my_array, elem) < 0) { 
    my_array.push(elem); 
} 

posso vedere che sta utilizzando la funzione di __indexOf che è definita al in cima alla sceneggiatura.

La mia domanda riguarda questo caso d'uso: Voglio rimuovere un elemento da un array e voglio supportare IE8. Posso farlo facilmente con indexOf e splice nei browser che supportano indexOf su un oggetto array. Tuttavia, in questo IE8 non funziona:

if (attr_index = my_array.indexOf(elem)) > -1 
    my_array.splice(attr_index, 1) 

Ho provato ad utilizzare la funzione __indexOf definito da CoffeScript ma ottengo un errore di parola riservata nel compilatore.

if (attr_index = __indexOf.call(my_array, elem) > -1 
    my_array.splice(attr_index, 1) 

Così come posso usare CoffeScript o c'è un metodo più discreto per chiamare indexOf? Sembra strano definire la stessa funzione due volte, solo perché CoffeeScript non mi permette di usare la loro ...

+0

possibile duplicato di [Pulisci il modo per rimuovere l'elemento dall'array javascript (con jQuery, coffeescript)] (http://stackoverflow.com/questions/4825812/clean-way-to-remove-element-from-javascript-array-with-jquery-coffeescript) –

risposta

7

No, CoffeeScript ti impedisce di usare direttamente i suoi aiutanti, poiché ciò spezzerebbe la distinzione tra la lingua e l'implemento. Per sostenere IE8, vorrei aggiungere uno spessore come

Array::indexOf or= (item) -> 
    for x, i in this 
    return i if x is item 
    return -1 

o utilizzare una libreria come Underscore.js per la manipolazione di array.

2

CoffeeScript aggiunge quanto segue alla parte superiore del campo di applicazione del file:

var __indexOf = [].indexOf || function(item) { 
    for (var i = 0, l = this.length; i < l; i++) { 
    if (i in this && this[i] === item) return i; 
    } 
    return -1; 
}; 

Se abbiamo cercato di utilizzare questo facendo:

indexOf = __indexOf 

Questo produrrebbe un errore di compilazione: RESERVED WORD "__INDEXOF"

La soluzione è di sovvertire il compilatore usando i backtick:

indexOf = `__indexOf` 

quindi utilizzarlo con

indexOf.call([1,2,3,4], 3) //2 

Oppure potremmo ridurre il codice duplicato dalla risposta di @Trevor Burnham:

Array::indexOf or= `__indexOf` 

Tuttavia, è necessario essere sicuri CoffeeScript sarà l'aggiunta di questa definizione, rendendo uso dell'operatore in come espressione booleana (e con una matrice di lunghezza dinamica sul lato destro). Alla fine della giornata, potrebbe essere semplicemente più semplice ridefinirlo :)

+4

corretto anche se questa risposta è raccomandata per il caso generale non lo è. fugace è questo mondo transitorio.sapendo che i dettagli di questa implementazione saranno presenti nella prossima versione di CoffeeScript, non lo faremo. – flow

+1

divertente, parlando come yoda è :) – jpillora