2012-06-21 18 views
5

ich den folgenden Code in Coffeescript mit:Mit indexOf in Coffeescript

if elem in my_array 
    do_something() 

Welche dieser Javascript erstellt:

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

ich es mit der Funktion __indexOf sehen kann, die bei der definiert ist Spitze des Skripts.

Meine Frage bezieht sich auf diesen Anwendungsfall: Ich möchte ein Element aus einem Array entfernen, und ich möchte IE8 unterstützen. Ich kann das einfach mit indexOf und splice in Browsern, die indexOf auf einem array Objekt unterstützen. in IE8 Allerdings funktioniert das nicht:

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

ich die __indexOf Funktion von Coffeescript definiert mit versucht, aber ich bekommen ein reserviertes Wort Fehler in dem Compiler.

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

So wie kann ich Coffeescript oder gibt es eine unauffällige Methode indexOf für den Aufruf? Es scheint komisch, die gleiche Funktion zweimal zu definieren, nur weil CoffeeScript mich ihre nicht verwenden lässt ...

+0

mögliche Duplikate von [Clean Weg, um Element aus Javascript-Array (mit jQuery, coffeescript) zu entfernen] (http://StackOverflow.com/questions/4825812/clean-way-to-remove-element-von-javascript-array-with-jquery-coffeescript) –

Antwort

7

Nein, CoffeeScript schließt die direkte Verwendung seiner Helfer aus, da dies den Unterschied zwischen der Sprache und die Umsetzung. Zur Unterstützung von IE8, würde ich eine Shim wie

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

hinzufügen oder eine Bibliothek wie Underscore.js für Array-Bearbeitung verwenden.

2

Coffee fügt die folgenden an die Spitze der Dateigültigkeitsbereich: Dieses

indexOf = __indexOf 

erzeugen würde einen Compiler-Fehler: RESERVED WORD "__INDEXOF"

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

Wenn wir dies tun zu nutzen versucht Die Lösung besteht darin, den Compiler mit Backticks zu unterlaufen:

indexOf = `__indexOf` 

Benutzen Sie diese dann mit

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

Oder wir könnten den doppelten Code von @Trevor Burnham Antwort reduzieren:

Array::indexOf or= `__indexOf` 

Allerdings müssen Sie sicher sein, Coffeescript wird diese Definition das Hinzufügen, indem Verwendung des Operators in als booleschen Ausdruck (und mit einem Array dynamischer Länge auf der rechten Seite). Am Ende des Tages, könnte es einfach für einige einfach sein, es neu zu definieren :)

+4

richtig, obwohl diese Antwort ist, empfohlen für den allgemeinen Fall ist es nicht. flüchtig ist diese vergängliche Welt.Wir wissen, dass dieses Implementierungsdetail in der nächsten Version von CoffeeScript nicht enthalten sein wird. – flow

+1

Spaß, Sprechen wie Yoda ist :) – jpillora