इस स्थिति में .map () क्या कर रहा है?


95

Chrome कंसोल का उपयोग करना, यह मेरा इनपुट और आउटपुट है:

[0].map(Array);

[[0, 0, [0]]]; // output

यहाँ क्या हो रहा है?

संपादित करें

इसका कारण मुझे उत्सुक बनाता है क्योंकि कुछ ऐसा है

[0].map(String);

वापस होगा

["0"];

और नहीं

["0", "0", "String"]

34
मुझे लगता है क्योंकि वह हमेशा खुश महसूस करने के लिए कुछ जावास्क्रिप्ट डब्ल्यूटीएफ की जरूरत है
12

12
ओह, यह सिर्फ एक कम wtf-y वैरिएंट है['10', '10', '10'].map(parseInt)
gronostaj

2
एक और अजीब .map()व्यवहार: stackoverflow.com/questions/14528397/… सामान्य तौर पर, आपको .map()एक से अधिक तर्क लेने वाले कार्यों का उपयोग करते समय सावधान रहना होगा।
बमर

2
बस[0].map(console.log)
बरगी

1
@Jacksonkr: उत्तर के लिए धन्यवाद। मुझे लगता है कि यह इस तरह से चला गया: मैंने एक टिप्पणी लिखी, जिसमें बताया गया कि जेएस डब्ल्यूटीएफ को देखकर मुझे खुशी होती है कि मुझे अक्सर भाषा का उपयोग नहीं करना पड़ता है। किसी ने पूछा कि अगर मुझे भाषा पसंद नहीं है तो मैं जेएस प्रश्नों को क्यों देखूंगा। npst ने उत्तर दिया, और पहले दो टिप्पणियां हटा दी गईं। यह अजीब है उसकी टिप्पणी अभी भी उठी हुई है, हाँ।
एरिक डुमिनील

जवाबों:


123

.map()समारोह बुला रहा है Array()तीन तर्कों, सरणी तत्व जो है के मूल्य के साथ समारोह 0उस तत्व के सूचकांक में भी 0, और पूरे सरणी के लिए एक संदर्भ।

तो यह ऐसा करने की तरह है:

var a = [0];
var index = 0
Array(a[index], index, a);   // create array with three elements

Array()तब तक लौटाया गया सरणी, सरणी का पहला तत्व बन जाता .map()है, जो आपके [[0, 0, [0]]]परिणाम में नेस्टिंग का अतिरिक्त स्तर बनाता है ।

अपने संपादन से संबंधित EDIT: जब आप कहते हैं [0].map(String);कि परिणाम में String()समान तीन तर्कों के साथ बुलाया जा रहा है String(a[index], index, a), लेकिन String()फ़ंक्शन सभी को अनदेखा करता है , लेकिन पहला तर्क, जबकि Array()सभी आपूर्ति किए गए तर्कों का उपयोग करता है।


39

सबसे पहले , Arrayसरणियों को बनाने के लिए एक फ़ंक्शन के रूप में इस्तेमाल किया जा सकता है:

var arr = Array(1, 2, "Hello");

console.log(arr); // [1, 2, "Hello"]

दूसरे , mapइसके कॉलबैक में तीन पैरामीटर पास करते हैं: एलीमेंट, ऐरे से इसका इंडेक्स और खुद एरे।

इसलिए , चूंकि आपके सरणी में एक तत्व है, पंक्ति:

[0].map(Array);

के बराबर है:

[Array(0, 0, [0])];     // the element 0 in the original array will be mapped into Array(0, 0, [0])

6

आप अद्यतन सवाल के बाद। अन्य उत्तर आपको मानचित्र के बारे में जानकारी प्रदान करते हैं

जवाब देने के लिए कि सरणी और स्ट्रिंग अलग-अलग क्यों दिखते हैं

स्ट्रिंग कंस्ट्रक्टर 1 पैरामीटर स्ट्रिंग (चीज) को स्वीकार करते हैं, जबकि सरणी नया ऐरे (एलिमेंट, एलिमेंट 1 [, ... [, एलिमेंट]])


2
यही कारण है कि .map(Number)हर वस्तु को किसी वस्तु की तरह लौटाने के बजाय हर वस्तु को संख्या में परिवर्तित किया जाता है [3, 2, [4, 1, 3]]
user4642212 1

@Xufox हां का जवाब कंस्ट्रक्टरों में है :)
वोलोडिमिर बिलाचैट

4

यह पुकार

[0].map(Array);

आपको वही परिणाम देता है जैसे कि आपने कुछ ऐसा लिखा है:

[0].map(function (value, index, array) {
    return Array(value, index, array);
})

मानचित्र फ़ंक्शन तीन मापदंडों के साथ एरे फ़ंक्शन को बुला रहा है : तत्व का मूल्य, तत्व का सूचकांक और पूरे सरणी। यह कॉल Arrayआपको 3 तत्वों के साथ सरणी देता है: मूल्य (संख्या 0), सूचकांक (संख्या 0), पूरे सरणी ( [0])।

और यह नया सरणी मूल सरणी में लिपटा हुआ है, क्योंकि आपने मूल तत्व (संख्या 0) को नए तत्व (3 तत्वों की सरणी) में मैप किया है

नोट: आप का उपयोग केवल पहले पैरामीटर का उपयोग करने के लिए किया जा सकता है

array.map(function (a) { return a * a; });

या सूचकांक प्राप्त करने के लिए सिर्फ दो का उपयोग कर

array.map(function (item, index) { return "index=" + index + ", value=" + item; });

लेकिन आपको यह याद रखने की आवश्यकता है कि mapअभी भी 3 पैरामीटर प्रदान करता है जिसे आप अपने कॉलबैक फ़ंक्शन में अनदेखा करते हैं। यही कारण है कि जैसे कोड:

[0].map(String);

रिटर्न

["0"]

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

String(11, "Some", "other", "ignored", "parameters")

आपको अभी भी मिलेगा

"11"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.