2016-09-09 3 views
0

jQueryの親子セレクタ文字列を列挙する便利な機能が必要でした。私はCS 1.10.0で動作するように次のものを得ることはできません(1.7.1でテスト済み)。私は間違って何をしていますか?CoffeeScript:曖昧なカンマが空白の区切り文字で結合されています

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" 

ありがとう!

(私もCSリポジトリ内の問題としてこれを掲載しました)

答えて

1

ループ読解:

expr for e in array 

アレイに評価されます。これは、次のことを意味します。

[ expr for e in array ] 

実際には、最初の(かつ唯一の)要素がループの配列である単一の要素配列です。もっと明示的に:

i for i in [1,2,3] 

[1,2,3]が、これです:

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

[[1,2,3]]です。

pcselは、追加のレベルのネストで終了し、joinコールの文字列で予期しないコンマが追加されます。

ソリューションはpcselを修正することです:

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

あなたは優先順位の問題を回避するために括弧(かっこはない)が必要です。かっこ(())と角かっこ([])は、まったく異なる機能を提供するので、適切な機能を使用する必要があります。

0

私が知ることから、あなたが目にしている動作は期待されるものです。

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

あなたは複数を使用して後にしているものを達成できます。

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

あなたはまた、ノードで同じ動作が表示されます:ここでは、明示的に配列してスプラットを交換する場合は、あなたのコードがどのように動作するかです.joinに電話するか、次のようにする:

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 
関連する問題