2016-09-09 2 views
0

Ich wollte eine praktische Funktion, um jQuery Eltern> Kind-Selektor-Strings zu verketten. Ich kann Folgendes nicht in CS 1.10.0 (auch in 1.7.1 getestet) erhalten. Was mache ich falsch?CoffeeScript: Falsch Komma im Verständnis verbunden durch leeres Trennzeichen

pcsel = (parent_sel, child_sels...) -> 
    ### Uitlity for forming parent > child selector string ### 
    childchain = [" > " + child for child in child_sels] 
    parent_sel + childchain.join('') 

console.log pcsel("foo", "bar") # OK. yields "foo > bar" 
console.log pcsel("foo", "bar", "glop") # BAD. yields "foo > bar, > glop" 
# Sanity check 
console.log "foo" + [" > bat", " > glop"].join('') # OK. yields "foo > bar > glop" 

Vielen Dank!

(Ich habe auch dies als ein Problem in der CS-Repository veröffentlicht)

Antwort

1

Eine Schleife Verständnis:

expr for e in array 

auf ein Array auswertet. Das bedeutet, dass dies:

[ expr for e in array ] 

ist eigentlich ein einzelnes Element-Array, dessen erstes (und einziges) Element das Array aus der Schleife ist. explizit Mehr:

i for i in [1,2,3] 

ist [1,2,3] aber dies:

[ i for i in [1,2,3] ] 

[[1,2,3]] ist.

Ihr Problem ist, dass childchain in pcsel endet mit einer zusätzlichen Ebene der Verschachtelung und der stringification vom join Aufruf fügt unerwartete Kommas.

Die Lösung ist pcsel zu beheben:

childchain = (" > " + child for child in child_sels) 
# -----------^-------------------------------------^ 

Sie müssen die Klammern (nicht Klammern) um Vorrang Fragen zu erhalten; Klammern (()) und Klammern ([]) dienen völlig verschiedenen Funktionen, so dass Sie die richtigen verwenden müssen.

0

Von dem, was ich sagen kann, ist das Verhalten, das Sie sehen, was zu erwarten ist. Hier ist, wie Sie den Code verhält, wenn Sie das Splat mit einem expliziten Array ersetzen:

coffee> ["> " + ['bar']]  # => ['> bar'] 
coffee> ["> " + ['bar', 'baz']] # =>['> bar,baz'] 

Sie werden auch das gleiche Verhalten in Knoten sehen:

> [">" + ['bar']]   // => ['>bar'] 
> ["> " + ['bar', 'baz']] // => ['> bar,baz'] 

Sie könnten erreichen, was Sie nach mehreren mit Anrufe an .join, oder indem Sie so etwas tun:

pcsel = (parent_sel, child_sels...) ->  
    child_sels.reduce (memo, sel) -> 
     memo + " > #{sel}" 
    , parent_sel 

console.log pcsel("foo", "bar") # => foo > bar 
console.log pcsel("foo", "bar", "glop") # => foo > bar > glop 
console.log pcsel("foo", "bar", "glop", "baz") # => foo > bar > glop > baz 
Verwandte Themen