2012-09-23 12 views
10

मैंने कुछ उदाहरण देखे हैं जो दिखाते हैं कि फ़ायरफ़ॉक्स *something* if *expression*; की लाइनों के साथ किसी प्रकार का जावास्क्रिप्ट वाक्यविन्यास का समर्थन करता है।* कुछ * अगर * अभिव्यक्ति * जावास्क्रिप्ट (एफएफ) में वाक्यविन्यास

मैं क्या बात कर रहा हूँ का एक उदाहरण के रूप में, this MDN article है, जो निम्न उदाहरण शामिल देखें:

var evens = [i for each (i in range(0, 21)) if (i % 2 == 0)]; 

मेरे प्रश्न हैं:

क्या नाम दिया जाएगा इस तरह का वर्णन करने के लिए वाक्य - विन्यास? मैं मुख्य रूप से यह जानना चाहता हूं ताकि मैं इसे Google कर सकूं और इसके बारे में और अधिक पढ़ सकूं। मैंने गुगलिंग को सबसे अच्छा करने की कोशिश की है, लेकिन मैं सहायक परिणाम प्राप्त करने के लिए सही शर्तों को एक साथ रखने में सक्षम नहीं हूं।

क्या यह वाक्यविन्यास किसी भी सरणी समझ के बाहर अन्य स्थानों में मौजूद हो सकता है? मुझे लगता है कि मैंने इस उदाहरण के अन्य उदाहरणों को एक सरणी के बाहर इस्तेमाल किया है (जैसे ऊपर दिए गए उदाहरण में), लेकिन मुझे यकीन नहीं है।

मैं इस वाक्यविन्यास के बारे में और कहां पढ़ सकता हूं?

क्या कोई अन्य ब्राउज़र फ़ायरफ़ॉक्स के अलावा इसका समर्थन करता है?

क्या यह सुविधा ईएस 5 में है या ईएस-सद्भाव के लिए योजना बनाई गई है?

+0

_ "इस तरह के वाक्यविन्यास का वर्णन करने के लिए क्या नाम दिया जाएगा?" _ - जो लेख आपने लिंक किया है उसे "ऐरे समझ" कहते हैं। – nnnnnn

+0

मैं गलत हो सकता हूं, लेकिन मुझे लगता है कि यह शब्द किसी सरणी भाग के अंदर 'प्रत्येक के लिए' का जिक्र कर रहा था। मुझे लगता है कि मैंने इस अलग-अलग 'if' वाक्यविन्यास को सरणी के बाहर इस्तेमाल किया है, लेकिन मुझे यकीन नहीं है। ? –

+0

_ केवल सरणी समझ को और अधिक कॉम्पैक्ट नहीं है, लेकिन यह वास्तव में पढ़ने के लिए आसान है, ** एक बार जब आप अवधारणा से परिचित हो जाते हैं ** ._ मैं केवल एक बार इसका उपयोग करने की हिम्मत करता हूं, मुझे यकीन है कि हर कोई सिंटैक्स जानता है। रखरखाव एक हिंसक मनोचिकित्सक है और सभी ... – Laoujin

उत्तर

4

के रूप में दूसरों का उल्लेख किया है, यह "सरणी comprehensions" कहा जाता है और यह कई में से एक है, कई सुविधाओं ECMAScript सद्भाव के लिए सुझाव:

http://wiki.ecmascript.org/doku.php?id=harmony:array_comprehensions

हालांकि, काफी हर सद्भाव "सुविधा" के साथ के रूप में , मुझे नहीं लगता कि इस बारे में कोई वास्तविक धारणा है कि क्या इसे वास्तव में अंतिम रिलीज में शामिल किया जा रहा है या नहीं। आप इसे "जावास्क्रिप्ट 1.7" (एक नेबुलस "मानक" विनिर्देश "के हिस्से के रूप में फ़ायरफ़ॉक्स में उपयोग कर सकते हैं, वास्तव में केवल मोज़िला-आधारित सामग्री पर लागू होता है); हालांकि, आप एफएफ-विशिष्ट वाक्यविन्यास से बचने से बेहतर हैं, खासकर जब यह अन्य ब्राउज़रों में सिंटैक्स त्रुटियों का कारण बनता है।

आप "ऐरे समझ" के लिए Google खोज करके इसके बारे में अधिक पढ़ सकते हैं, लेकिन जैसा कि मैंने उल्लेख किया है, यह मोज़िला-विशिष्ट प्रकृति के कारण यह एक बहुत ही उपयोगी टूल नहीं है।

आप reduce() सरणी विधि ES5 में शुरू का उपयोग कर भी बहुत कुछ कोड के बिना एक समान प्रभाव को प्राप्त कर सकते हैं:

//JavaScript has no "range" function, so let's make one 
var range = function (begin, length) { 
    var i, ret = []; 
    for (i = begin; i < begin + length; i++) { 
     ret.push(i); 
    } 
    return ret; 
}; 

var evens = range(0, 21).reduce(function (arr, cur) { 
    if (cur % 2 === 0) arr.push(cur); 
    return arr; 
}, []); 

हो सकता है यही कारण है कि एक छोटे से वर्बोज़ की तुलना में क्या आप के लिए (यहां तक ​​कि ध्यान में रखते हुए देख रहे थे कि हम range() फ़ंक्शन बनाना था)। लेकिन यह अपेक्षाकृत कॉम्पैक्ट समाधान है जिसके लिए बहुत सारे "सेटअप" की आवश्यकता नहीं होती है और मुख्य रूप से समस्या को हल करने के लिए चिपक जाती है: एक सरणी से तत्वों को दूसरी सरणी बनाने के लिए फ़िल्टर करना।

मैं इसे एक लाइनर में कम करने में सक्षम था, लेकिन यह बनाए रखने के लिए थोड़ा असहज हो गया, इसलिए मैंने इसके बजाय दो लाइन संस्करण का सुझाव देने का फैसला किया।यदि आप एक लाइनर में दिलचस्पी रखते हैं, तो यहां यह है:

//Don't forget to define "range()" 
var evens = range(0, 21).reduce(function (arr, cur) { 
    return (cur % 2 === 0) ? (arr.push(cur) && arr) : arr; 
}, []); 

फिर, यह ES5 कोड है। यदि आप पुराने ब्राउज़र में काम करना चाहते हैं, तो आपको Array.reduce() के लिए समर्थन प्रदान करने के लिए एक शिम के साथ आने की आवश्यकता होगी। MDN यहाँ एक है:

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/Reduce

अद्यतन:

ऐसा लगता है कि मैं filter() बजाय reduce() इस्तेमाल किया जाना चाहिए था। कोड को अधिक क्लीनर बनाता है। सुझाव देने के लिए ओपी के लिए धन्यवाद!

var evens = range(0,21).filter(function (cur) { return cur % 2 === 0; }); 

फिर, filter() ES5 है, तो आप क्रम में एक शिम की आवश्यकता होगी सुनिश्चित करने के लिए यह पुराने ब्राउज़र पर ठीक ढंग से काम नहीं है।

+1

+1, लेकिन "जावास्क्रिप्ट 1.7" किसी भी प्रकार का मानक नहीं है। जावास्क्रिप्ट ब्राउज़र में उपयोग के लिए ECMAScript का मोज़िला का स्वामित्व कार्यान्वयन है। इसके लिए एक विनिर्देश भी नहीं है, एकमात्र दस्तावेज जो निकट आता है वह है [ऑनलाइन संदर्भ] (https://developer.mozilla.org/en-US/docs/JavaScript/Reference), जिसे बनाए रखा जाता है एक समुदाय विकी। – RobG

+0

+1, सभी जानकारी के लिए धन्यवाद! मैं ईएस 5 संस्करण के लिए 'कम' के बजाय 'फ़िल्टर' का उपयोग करूंगा। लेकिन अगर मैं एक परियोजना पर काम कर रहा हूं कि मैं केवल एफएफ होने के साथ ठीक हूं, तो मैं JS1.7 सुविधाओं का उपयोग कर भी ठीक हूं। –

+0

@RobG धन्यवाद। अपडेट किया गया। – Pete

2

इस प्रकार का कथन list comprehension के रूप में जाना जाता है। Python में बहुत समान वाक्यविन्यास के साथ अच्छे उदाहरण हैं।

+0

प्लस 1, धन्यवाद! –