दिलचस्प पोस्ट
मैं कार्ड-कॉलम ऑर्डर क्षैतिज कैसे बना सकता हूं? विदग्ध द्वारा पहला तत्व खोजें वायर्ड का उपयोग करके कॉल बैक फ़ंक्शन से वापसी पाने के लिए एक चर सेट करना SKScene से UIViewController प्रस्तुत करना अजगर 2.7 में openssl को अद्यतन करना सी # वेब ब्राउजर अजाक्स कॉल मुझे जावा में पर्ल स्क्रिप्ट को कैसे कॉल करना चाहिए? जावा में क्लास एट्रिब्यूट्स पर लूप कैसे करें? सी # निर्माता निष्पादन आदेश अगर एप्लिकेशन पहले से ही चल रहा है तो पुश नोटिफिकेशन को कैसे नियंत्रित किया जाए? कंटेनेटिंग के बिना स्ट्रिंग में लगातार शामिल करें कैसे MySQL में एक विदेशी कुंजी बाधा अस्थायी रूप से अक्षम करने के लिए? एसक्यूएल चर के लिए एक निष्पाद परिणाम कैसे निर्दिष्ट करें? त्रुटि आयात tensorflow मॉड्यूल के दौरान कमांडलाइन में जावा कुंजी श्रोता

कैसे जावास्क्रिप्ट में एक सरणी की लंबाई को इनिशियलाइज़ करने के लिए?

अधिकांश ट्यूटोरियल जो मैंने जावास्क्रिप्ट में एरेज़ पर पढ़ा है ( w3schools और devguru सहित) सुझाव देते हैं कि आप var test = new Array(4); का उपयोग करके एरे कन्स्ट्रक्टर को पूर्णांक देकर एक निश्चित लंबाई के साथ एक सरणी को इनिशियलाइज़ कर सकते हैं var test = new Array(4); वाक्य – विन्यास।

मेरी जेएस फाइलों में इस सिंटैक्स को उदारतापूर्वक उपयोग करने के बाद, मैं जेएसएलआईआईटी के माध्यम से एक फाइल चलाया , और इसे ख़राब कर दिया:

त्रुटि: लाइन 1 वर्ण में समस्या 22: अपेक्षित ')' और इसके बजाय '4' देखा
var परीक्षण = नया अर्रे (4);
लाइन 1 वर्ण में समस्या 23: अपेक्षित ';' और बजाय ')' देखा
var परीक्षण = नया अर्रे (4);
लाइन 1 वर्ण में समस्या 23: एक पहचानकर्ता की अपेक्षा की गई और इसके बजाय ')' दिखाई दी

जेएसएलआईंट के अपने व्यवहार के बारे में स्पष्टीकरण के बाद, ऐसा लगता है कि जेएसएलआईंट वास्तव में new Array() सिंटैक्स पसंद नहीं करता, और इसके बजाय एआरएर्स घोषित करते समय [] पसंद करता है।

तो मेरे पास कुछ सवाल हैं सबसे पहले, क्यों? क्या मैं इसके बजाय new Array() सिंटैक्स का उपयोग कर किसी भी जोखिम को चला रहा हूं? क्या ब्राउज़र असंगतियां हैं जिन्हें मुझे पता होना चाहिए? और दूसरी, अगर मैं चौकोर ब्रैकेट वाक्यविन्यास पर स्विच करता हूँ, तो क्या कोई सरणी घोषित करने और इसकी लंबाई एक पंक्ति में तय करने का कोई तरीका है, या मुझे ऐसा कुछ करना होगा:

 var test = []; test.length = 4; 

Solutions Collecting From Web of "कैसे जावास्क्रिप्ट में एक सरणी की लंबाई को इनिशियलाइज़ करने के लिए?"

  1. आप लंबाई को क्यों प्रारंभ करना चाहते हैं? सैद्धांतिक रूप से इसके लिए कोई ज़रूरत नहीं है इससे भ्रामक व्यवहार भी हो सकता है, क्योंकि सभी परीक्षण जो पता लगा सकते हैं कि कोई सरणी खाली है या नहीं, यह बताएगा कि सरणी खाली नहीं है या नहीं।
    कुछ परीक्षणों से पता चलता है कि बड़ी सरणियों की प्रारंभिक लंबाई निर्धारित करना अधिक कुशल हो सकता है यदि सरणी को बाद में भर दिया जाता है, लेकिन प्रदर्शन लाभ (यदि कोई है) ब्राउज़र से ब्राउज़र में अलग दिखता है

  2. jsLint new Array() पसंद नहीं करता क्योंकि कन्स्ट्रक्टर अस्पष्ट है।

     new Array(4); 

    4 की एक खाली सरणी बनाता है। लेकिन

     new Array('4'); 

    मूल्य '4' वाला एक सरणी बनाता है

आपकी टिप्पणी के संबंध में: जेएस में आपको सरणी की लंबाई को प्रारंभ करने की आवश्यकता नहीं है। यह गतिशील रूप से बढ़ता है आप बस कुछ चर में लंबाई को स्टोर कर सकते हैं, उदा

 var data = []; var length = 5; // user defined length for(var i = 0; i < length; i++) { data.push(createSomeObject()); } 
  • Array(5) आपको 5 की लंबाई के साथ एक सरणी देता है लेकिन कोई भी मान नहीं है, इसलिए आप इसे फिर से नहीं कर सकते।

  • Array.apply(null, Array(5)).map(function () {}) आपको लंबाई 5 के साथ एक सरणी देता है और मूल्यों के रूप में अनिर्धारित है, अब इसे दोहराया जा सकता है।

  • Array.apply(null, Array(5)).map(function (x, i) { return i; }) आपको लंबाई 5 और array 0,1,2,3,4 के साथ एक सरणी देता है

  • Array(5).forEach(alert) कुछ भी नहीं है, Array.apply(null, Array(5)).forEach(alert) आपको 5 अलर्ट देता है

  • ES6 हमें Array.from देता है Array.from इसलिए अब आप Array.from(Array(5)).forEach(alert) उपयोग भी कर सकते हैं Array.from(Array(5)).forEach(alert)

  • यदि आप किसी निश्चित स्ट्रिंग मान से आरम्भ करना चाहते हैं, तो Array.from('abcde') या Array.from('x'.repeat(5)) अच्छा है …

ES2015 के साथ .फिल .fill() अब आप बस कर सकते हैं:

 //n is the size you want to initialize your array Array(n).fill(0) 

जो Array.apply(0, new Array(n)).map(i => 0) से अधिक संक्षिप्त है। Array.apply(0, new Array(n)).map(i => 0)

यह लंबाई की संपत्ति को 4 से प्रारंभ करेगा:

 var x = [,,,,]; 

मुझे आश्चर्य है कि वहाँ एक कार्यात्मक समाधान नहीं बताया गया है जो आपको एक पंक्ति में लंबाई निर्धारित करने की अनुमति देता है। निम्नलिखित अंडरस्कोर जेएस पर आधारित है:

 var test = _.map(_.range(4), function () { return undefined; }); console.log(test.length); 

उपर्युक्त कारणों के लिए, मैं ऐसा करने से बचना चाहूंगा जब तक कि मैं किसी विशेष मूल्य के लिए सरणी को इनिशियलाइज़ करना नहीं चाहता था। यह नोट करना दिलचस्प है कि ऐसे अन्य लाइब्रेरी हैं जो लो-डैश और आलसी सहित रेंज को लागू करते हैं, जिसमें अलग-अलग प्रदर्शन विशेषताओं हो सकती हैं।

(यह शायद एक टिप्पणी के रूप में बेहतर था, लेकिन बहुत अधिक मिला)

इसलिए, इसे पढ़ने के बाद मैं उत्सुक था कि अगर पूर्व-आवंटन वास्तव में तेजी से हो, क्योंकि सिद्धांत में यह होना चाहिए। हालांकि, इस ब्लॉग ने कुछ सुझाव http://www.t5rocks.com/en/tutorials/speed/v8/

इसलिए अभी भी अनिश्चित है, मैं इसे परीक्षण में डाल दिया। और जैसा कि यह पता चला है यह वास्तव में धीमी है

 var time = Date.now(); var temp = []; for(var i=0;i<100000;i++){ temp[i]=i; } console.log(Date.now()-time); var time = Date.now(); var temp2 = new Array(100000); for(var i=0;i<100000;i++){ temp2[i] = i; } console.log(Date.now()-time); 

यह कोड कुछ कैजुअल रनों के बाद निम्न पैदा करता है:

 $ node main.js 9 16 $ node main.js 8 14 $ node main.js 7 20 $ node main.js 9 14 $ node main.js 9 19 
 var arr=[]; arr[5]=0; alert("length="+arr.length); // gives 6 

आपको new Array का उपयोग नहीं करने का कारण इस कोड द्वारा प्रदर्शित किया जाता है:

 var Array = function () {}; var x = new Array(4); alert(x.length); // undefined... 

कुछ अन्य कोड में अर्रे वेरिएबल के साथ गड़बड़ हो सकता है मुझे पता है कि यह थोड़ा बहुत अच्छा लगा है कि कोई ऐसा कोड लिख सकता है, लेकिन फिर भी …

इसके अलावा, फेलिक्स किंग के अनुसार, इंटरफ़ेस थोड़ा असंगत है, और कुछ बहुत मुश्किल-टू-ट्रैक-डाउन कीड़े को ले जा सकता है

यदि आप लंबाई = x के साथ एक सरणी चाहते हैं, तो अपरिभाषित (जैसा कि new Array(x) होता है), आप यह कर सकते हैं:

 var x = 4; var myArray = []; myArray[x - 1] = undefined; alert(myArray.length); // 4 

सरणी निर्माता के पास एक अस्पष्ट सिंटैक्स है , और JSLint बस आपकी भावनाओं को सभी के लिए परेशान करता है।

साथ ही, आपका उदाहरण कोड टूटा हुआ है, दूसरा var SyntaxError स्टेटमेंट SyntaxError बढ़ाएगा। आप सरणी test की संपत्ति की length निर्धारित कर रहे हैं, इसलिए किसी अन्य var की कोई आवश्यकता नहीं है।

जहाँ तक आपके विकल्प जाते हैं, array.length केवल "साफ" एक ही है प्रश्न है, आपको पहली जगह में आकार को सेट करने की आवश्यकता क्यों है? उस निर्भरता से छुटकारा पाने के लिए अपने कोड को रिएक्टर करने का प्रयास करें

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

निश्चित रूप से इस मामले में से कोई भी नहीं, जब तक कि आप बड़े सरणियों के साथ कुछ अच्छा करना नहीं चाहते तो यह करता है

जैसा कि वहां अभी भी एक सरणी की प्रारंभिक क्षमता निर्धारित करने के लिए फिलहाल जेएस में कोई विकल्प नहीं दिख रहा है, मैं निम्नलिखित का उपयोग करता हूं …

 var newArrayWithSize = function(size) { this.standard = this.standard||[]; for (var add = size-this.standard.length; add>0; add--) { this.standard.push(undefined);// or whatever } return this.standard.slice(0,size); } 

शामिल हैं tradeoffs:

  • इस पद्धति को तब तक ले जाता है जब दूसरों को फ़ंक्शन पर पहली कॉल के लिए, लेकिन बाद में कॉल के लिए बहुत कम समय (जब तक कि किसी बड़े ऑरेंज की मांग न करें)।
  • standard सरणी आपके लिए सबसे बड़ी सरणी के रूप में अधिक से अधिक स्थान को कायम रूप से आरक्षित करता है।

लेकिन अगर यह आप के साथ फिट बैठता है, तो एक अदायगी हो सकती है अनौपचारिक समय डालता है

 for (var n=10000;n>0;n--) {var b = newArrayWithSize(10000);b[0]=0;} 

बहुत तेजी से (10000 के लिए लगभग 50ms दिए गए, जिसमे n = 1000000 के साथ यह लगभग 5 सेकंड ले गया), और

 for (var n=10000;n>0;n--) { var b = [];for (var add=10000;add>0;add--) { b.push(undefined); } } 

एक मिनट से अधिक (एक ही क्रोम कंसोल पर 10000 के बारे में 90 सेकंड, या लगभग 2000 गुना धीमा) यह सिर्फ आवंटन नहीं होगा, बल्कि पाश के लिए, 10000 धक्का, आदि।

यहाँ एक और समाधान है

 var arr = Array.apply( null, { length: 4 } ); arr; // [undefined, undefined, undefined, undefined] (in Chrome) arr.length; // 4 

apply() का पहला तर्क apply() एक ऑब्जेक्ट बाध्यकारी है, जिसे हमें यहां परवाह नहीं है, इसलिए हम उसे null करने के लिए सेट करते हैं।

Array.apply(..) Array(..) फ़ंक्शन कॉल कर रहा है और { length: 3 } ऑब्जेक्ट वेल्यू को तर्क के रूप में फैलाता है।

जैसा कि ऊपर बताया गया है, new Array(size) का उपयोग कुछ हद तक खतरनाक है। इसे सीधे उपयोग करने के बजाय, इसे "एरे निर्माता कार्य" के अंदर रखें आप आसानी से यह सुनिश्चित कर सकते हैं कि यह फ़ंक्शन बग रहित है और आप सीधे new Array(size) को कॉल करने के खतरे से बचें इसके अलावा, आप इसे एक वैकल्पिक डिफ़ॉल्ट प्रारंभिक मान दे सकते हैं। यह createArray फ़ंक्शन ठीक उसी प्रकार करता है:

 function createArray(size, defaultVal) { var arr = new Array(size); if (arguments.length == 2) { // optional default value for (int i = 0; i < size; ++i) { arr[i] = defaultVal; } } return arr; } 

आप array.length = youValue का उपयोग करके सरणी लंबाई सेट कर सकते हैं

तो यह होगा

 var myArray = []; myArray.length = yourValue;