2014-04-24 5 views
6

मैं सिर्फ जेएस उच्च-आदेश कार्यों (मानचित्र, प्रत्येक के लिए, कम करने, आदि) का उपयोग करने के बारे में सीख रहा हूं, और भ्रम में ठोकर खाई है। मैं एक साधारण 'रेंज' फ़ंक्शन लिखने की कोशिश कर रहा हूं, लेकिन मेरे आउटपुट सरणी को पॉप्युलेट नहीं कर सकता।एक 'नया ऐरे' पर करने के लिए मैं जो कर रहा हूं वह नहीं कर रहा है

range(1, 4) // [1, 2, 3, 4] 

मैं इस हो रही है::

[undefined × 4] 

यहाँ मेरी कोड है:

function range(num1, num2) { 
     var rangeArr = new Array((num2 + 1) - num1); 
     return rangeArr.map(function(e, i, arr) {return arr[i] = num1 + i}); 
    } 

क्या मैं यहाँ याद आ रही है इस लक्ष्य है? जहां तक ​​मैं समस्या बता सकता हूं कि जिस तरह से मैं 'नया ऐरे' का उपयोग कर रहा हूं, उससे कुछ करने के लिए प्रतीत होता है, लेकिन उससे परे मैं खो गया हूं।

ओह, और यहां वह हिस्सा है जो वास्तव में मुझे भ्रमित करता है। यह ठीक काम करता है:

function bleck() { 
    var blah = [1, 2, 3, 4]; 
    var x = 'wtf'; 
    return blah.map(function(e, i, arr) {return arr[i] = x}) 
} 

["wtf", "wtf", "wtf", "wtf"] 

धन्यवाद !!

+0

ऐसा नहीं लगता कि आपको "(num2 + 1) - num1)" की आवश्यकता है, क्योंकि जावास्क्रिप्ट गतिशील सरणी का उपयोग करता है। – Serdnad

+0

@Serdnad यह आवश्यक नहीं है, लेकिन यह उस लंबाई की एक खाली सरणी बनाता है: 'ऐरे (4) = [अपरिभाषित x 4] ' – cincodenada

+1

' .map() 'का उपयोग करने के बारे में नोट जो आपकी समस्या से संबंधित नहीं है: में आपके कॉलबैक में 'वापसी एआर [i] = num1 + i' होने की कोई आवश्यकता नहीं है, आप बस' वापसी संख्या 1 + i; 'कह सकते हैं। 'Arr' में मानों को सेट करने का कोई मतलब नहीं है - जो' rangeArr' जैसा ही सरणी है - क्योंकि 'मानचित्र' एक नई सरणी बनाता है और यही वह है जो आप अपने 'श्रेणी()' फ़ंक्शन से लौट रहे हैं। – nnnnnn

उत्तर

4

forEach विधि पर के सूचकांक से अधिक होती है। दिलचस्प बात यह है कि जब आप new Array(n) के माध्यम से एक नया सरणी बनाते हैं, तो इसमें सभी पर कोई सूचकांक नहीं है। इसके बजाए, यह सिर्फ .length संपत्ति सेट करता है।

> var a = new Array(3); 
> console.info(a) 
[] 
> console.info([undefined, undefined, undefined]) 
[undefined, undefined, undefined] 

MDNforEach का वर्णन करता है, और विशेष रूप से कहा गया है:

foreach एक निर्दिष्ट मान के साथ सरणी के प्रत्येक तत्व के लिए एक बार प्रदान की कॉलबैक निष्पादित करता है।यह उन इंडेक्स के लिए नहीं बुलाया गया है जिनके पास हटा दिया गया है या हटाया गया है।

खाली, लेकिन मौजूदा, सूचकांक के साथ एक सरणी प्राप्त करने के लिए यहां एक साफ तकनीक है।

var a = Array.apply(null, Array(3)); 

यह काम करता है क्योंकि .apply उचित तर्क में elided तत्वों "का विस्तार", और परिणाम Array(undefined, undefined, undefined) की तरह कुछ किया जा रहा समाप्त होता है।

+0

बहुत अच्छा, एक आकर्षण की तरह काम किया !!! टी-माइनस 4 मिनट और गिनती में आपका जवाब स्वीकार करेंगे;) –

+0

जिज्ञासा से, कोई विचार क्यों कोई इंडेक्स के साथ कोई सरणी नहीं चाहता? क्या वह उद्देश्य को हराने में नहीं है? –

+0

@i_made_that: मैं वास्तव में इसके लिए उपयोग के मामले के बारे में सोच नहीं सकता। ऐसा लगता है कि मुझे जावास्क्रिप्ट के मानक एपीआई के लिए एक और पीछे की ओर संगत बर्नकल होना प्रतीत होता है। :] – voithos

0

समस्या यह है कि map अपरिभाषित प्रविष्टियों (*) को पुन: सक्रिय नहीं करता है।

मैं बजाय एक for पाश उपयोग करने का सुझाव:

var rangeArr = new Array((num2 + 1) - num1); 
for(var i=0; i<=num2-num1; ++i) 
    rangeArr[i] = num1 + i; 
return rangeArr; 

(*) अपरिभाषित प्रविष्टियों मेरा मतलब है rangeArr.hasOwnProperty(i) === false के साथ, rangeArr[i] === void 0 साथ भ्रमित होने की नहीं।

+0

[अपरिभाषित, अपरिभाषित, अपरिभाषित] .map() वास्तव में –

+0

@ क्रिस्टी मिहाई का मतलब है कि मेरा मतलब इस प्रकार का अपरिभाषित है: '[,,,]। नक्शा()' – Oriol

+0

मैं समझता हूं कि '.map() 'उन इंडेक्स पर पुनरावृत्ति नहीं होना चाहिए जिन्हें कभी मूल्य नहीं दिया गया है, लेकिन तो ओपी का कोड इसमें चार अनिर्धारित तत्वों के साथ एक सरणी क्यों लौटाता है और 4 का 'लम्बाई' क्यों होता है? – nnnnnn

1

सरणी को 4 एंटरों के साथ परिभाषित किया गया है जिनमें से प्रत्येक अनिर्धारित है।

मानचित्र अपरिभाषित entires पर पुनरावृत्ति नहीं करेगा, यह उन्हें छोड़ देता है।

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

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

1

जब आप एक new Array(x) यह पैदा कर रही है क्या एक विरल सरणी कहा जाता है, जो थोड़ा अलग तरीके से व्यवहार हो सकता है, जैसा कि आप देख सकते हैं, कुछ ब्राउज़र कहेंगे [undefined x 20,"foo", undefined x 5] अगर आप सिर्फ एक सेट मूल्य, और मेरा मानना ​​है कि यह उन मूल्यों पर पुन: प्रयास नहीं करता है।

+0

यकीन नहीं है कि मैं काफी पालन करता हूं। क्या आपका मतलब है कि अगर मैंने इसे 'var rangeArr' घोषणा के नीचे जोड़ा है: 'rangeArr [0] = num1'? –

संबंधित मुद्दे