2017-12-10 7 views
0

2つのリストには、類似したタイプのオブジェクトが含まれていて、交差するオブジェクトで操作しようとしています。CoffeeScriptの2つの配列に一致する要素を反復する

CoffeeScriptを使用してこの種のループを単純化する方法はありますか?

for a in aList 
    for b in bList 
     if a.id == b.id 
      doSomething a 

これは私が思い付くことができますが、それはまだ少し厄介ですがベストです:

doSomething a for a in aList when a.id in (b.id for b in bList) 

どれゴルフやコンパイルの最適化が認められます。

答えて

1

これはいかがですか?私はあなたの状況に2つのパターンを考えました。これをいくつかの答えの一つと考えてください。

パターン1

あなたのスクリプトで書かれた簡単な方法は以下のとおりです。

for a in aList 
    for b in bList 
     if a.id == b.id 
      doSomething a 

これを理解スクリプトとして変換すると、以下のようになります。

doSomething b for b in bList when b.id is a.id for a in aList 

両方のスクリプトをコンパイルすると、結果は次のようになります。

for (i = 0, len = aList.length; i < len; i++) { 
    a = aList[i]; 
    for (j = 0, len1 = bList.length; j < len1; j++) { 
    b = bList[j]; 
    if (a.id === b.id) { 
     doSomething(a); 
    } 
    } 
} 

注:

  • この方法は、あなたのdoSomething a for a in aList when a.id in (b.id for b in bList)よりも高速です。このスクリプトをコンパイルすると、以下のように2
    aList.map (a) -> bList.filter (b) -> a.id is b.id && doSomething a 
    

パターンは、結果があります。

aList.map(function(a) { 
    return bList.filter(function(b) { 
    return a.id === b.id && doSomething(a); 
    }); 
}); 

注:

  • この方法は、あなたのdoSomething a for a in aList when a.id in (b.id for b in bList)よりも遅くなります。

これは役に立たなかった場合は、ごめんなさい。

+0

私は 'map'と' filter'ソリューションが好きです。これは素晴らしいアプローチです。パフォーマンスについて恥ずべき。ありがとう! – Milk

+0

@Milkようこそ。あなたの質問から勉強することもできます。こちらこそありがとう。 – Tanaike

関連する問題