2011-01-29 19 views
33

CoffeeScript डॉक्स राज्य है कि सूची comprehensions चयन/फिल्टर संचालन करने के लिए सक्षम होना चाहिए:फ़िल्टर

वे सबसे स्थानों पर जहां आप अन्यथा एक पाश का प्रयोग करेंगे संभाल करने में सक्षम होना चाहिए, प्रत्येक/के लिए प्रत्येक, मानचित्र, या चयन/फ़िल्टर करें।

आप कल्पना आप result = item for item in list if item % 2 == 0 की तरह एक पंक्ति में कुछ कर सकते हैं लेकिन सबसे करीब मैं आ सकता है

list = [1,2,3,4] 
result = [] 
for item in list 
    if item % 2 == 0 then result.push item 

है क्या CoffeeScript में एक सूची फिल्टर करने के लिए सबसे संक्षिप्त तरीके से?

उत्तर

75
result = (item for item in list when item % 2 == 0) 

संपादित: result =

+2

रखो कि एक समारोह में, अन्यथा, यह कुछ भी नहीं करता है। इसे http://jashkenas.github.com/coffee-script/ में "कॉफ़ीस्क्रिप्ट का प्रयास करें" में टाइप करें और जावास्क्रिप्ट आउटपुट देखें। – Amir

+1

'कब' खंडों के बारे में नहीं पता था। धन्यवाद! –

8

जोड़ा जब तक आप बाहर प्रदर्शन के हर औंस निचोड़ की कोशिश कर रहे हैं, मैं इस प्रकार का फ़िल्टर समारोह बनाना होगा:

filter = (list, func) -> x for x in list when func(x) 

या यदि आप चाहते हैं इसे प्रत्येक सरणी के प्रोटोटाइप में जोड़ें:

Array::filter = (func) -> x for x in @ when func(x) 

और उसके बाद लिखें: (क्रमशः)

result = filter mylist, (x) -> x % 2 == 0 

या

result = mylist.filter (x) -> x % 2 == 0 

के लिए, इस जावास्क्रिप्ट उत्पन्न हो जाता है वह यह है कि:

var filter, result; 
filter = function(list, func) { 
    var x, _i, _len, _results; 
    _results = []; 
    for (_i = 0, _len = list.length; _i < _len; _i++) { 
     x = list[_i]; 
     if (func(x)) { 
      _results.push(x); 
     } 
    } 
    return _results; 
}; 
Array.prototype.filter = function(func) { 
    var x, _i, _len, _results; 
    _results = []; 
    for (_i = 0, _len = this.length; _i < _len; _i++) { 
     x = this[_i]; 
     if (func(x)) { 
      _results.push(x); 
     } 
    } 
    return _results; 
}; 
result = filter(mylist, function(x) { 
    return x % 2 === 0; 
}); 
result = mylist.filter(function(x) { 
    return x % 2 === 0; 
}); 

वहाँ एक समान प्रश्न here

+1

यह निश्चित रूप से व्यक्तिगत वरीयता का मामला है क्योंकि दोनों को नौकरी मिलती है - लेकिन उदाहरण के रूप में पाइथन लेना, सूची समझ को आम तौर पर कार्यात्मक प्रोग्रामिंग कार्यों पर प्राथमिकता दी जाती है क्योंकि उन्हें अधिक पठनीय माना जाता है। –

+1

वाट। ऐरे में पहले से ही यह सटीक कार्य है ... (शायद अधिक कुशल) –