2012-06-21 13 views
5
में indexOf का उपयोग

मैं CoffeeScript में निम्नलिखित कोड का उपयोग कर रहा:CoffeeScript

if elem in my_array 
    do_something() 

कौन इस जावास्क्रिप्ट को संकलित करता है:

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

मैं इसे समारोह __indexOf जिस पर परिभाषित किया गया है उपयोग कर रहा है देख सकते हैं लिपि के शीर्ष।

मेरा प्रश्न इस उपयोग के मामले के बारे में है: मैं एक सरणी से एक तत्व को हटाना चाहता हूं, और मैं IE8 का समर्थन करना चाहता हूं। मैं indexOf पर indexOf पर indexOf का समर्थन करने वाले ब्राउज़र में indexOf और splice के साथ आसानी से ऐसा कर सकता हूं। हालांकि, IE8 में यह काम नहीं करता है:

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

मैं __indexOf समारोह CoffeScript द्वारा परिभाषित उपयोग करने की कोशिश, लेकिन मैं संकलक में एक आरक्षित शब्द त्रुटि मिलती है।

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

तो मैं कैसे CoffeScript का उपयोग करें या वहाँ indexOf फोन करने के लिए एक और अधिक विनीत तरीका है सकते हैं? यह एक ही फ़ंक्शन को दो बार परिभाषित करने के लिए अजीब लगता है, क्योंकि कॉफीस्क्रिप्ट मुझे उनका उपयोग करने नहीं देगा ...

+0

संभावित डुप्लिकेट [जावास्क्रिप्ट सरणी (jQuery, coffeescript के साथ) से तत्व को हटाने के लिए साफ तरीका] (http://stackoverflow.com/प्रश्न/4825812/स्वच्छ-मार्ग-से-निकालने-तत्व-से-जावास्क्रिप्ट-सरणी-साथ-jquery-coffeescript) –

उत्तर

7

नहीं, कॉफीस्क्रिप्ट आपको अपने सहायकों का सीधे उपयोग करने से रोकता है, क्योंकि इससे भाषा के बीच भेद टूट जाएगा और कार्यान्वयन। IE8 का समर्थन करने के लिए, मैं की तरह

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

एक परत जोड़ने के लिए या सरणी हेरफेर के लिए Underscore.js की तरह एक पुस्तकालय का प्रयोग करेंगे। RESERVED WORD "__INDEXOF"

:

indexOf = __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; 
}; 

अगर हम ऐसा करने से इस का उपयोग करने का प्रयास किया:

2

CoffeeScript फ़ाइल दायरे के शीर्ष पर निम्नलिखित कहते हैं समाधान बैकटिक्स का उपयोग कर कंपाइलर को विचलित करना है:

indexOf = `__indexOf` 

फिर

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

के साथ उपयोग करें या हम @Trevor बर्नहैम के जवाब से डुप्लिकेट कोड को कम कर सकता:

Array::indexOf or= `__indexOf` 

, आपको यह सुनिश्चित CoffeeScript बनाकर इस परिभाषा जोड़ने किया जाएगा की जरूरत है हालांकि in ऑपरेटर का उपयोग बूलियन अभिव्यक्ति के रूप में (और दाईं ओर एक गतिशील लंबाई सरणी के साथ)। दिन के अंत में, कुछ लोगों को बस इसे फिर से परिभाषित करना आसान हो सकता है :)

+4

सही है हालांकि यह उत्तर सामान्य मामला के लिए अनुशंसित है। बेड़े इस क्षणिक दुनिया है।यह कार्यान्वयन विस्तार जानने के लिए कॉफीस्क्रिप्ट के अगले संस्करण में हम नहीं होंगे। – flow

+1

मज़ा, योड की तरह बोल रहा है :) – jpillora