सरणी में मानचित्र कुंजियाँ कैसे बदलें?


237

कहते हैं, मेरे पास निम्नलिखित मानचित्र हैं:

let myMap = new Map().set('a', 1).set('b', 2);

और मैं उपरोक्त के आधार पर ['ए', 'बी'] प्राप्त करना चाहता हूं। मेरा वर्तमान समाधान इतना लंबा और भयानक लगता है।

let myMap = new Map().set('a', 1).set('b', 2);
let keys = [];
for (let key of myMap)
  keys.push(key);
console.log(keys);

एक बेहतर तरीका होना चाहिए, नहीं?


17
शायद Array.from(Map.keys())
डैन डी।


5
@gK। यह साथ काम नहीं करता है Map
पावेल

@ पावेल ओह सॉरी फिर!
हैमिक्स

Array.from(Map.values())- अगर मामले में, आपको कुंजियों के बजाय मूल्यों की आवश्यकता है।
मनोहर रेड्डी पोरडे

जवाबों:


436

Map.keys()एक रिटर्न MapIteratorवस्तु जो करने के लिए परिवर्तित किया जा सकता Arrayका उपयोग कर Array.from:

let keys = Array.from( myMap.keys() );
// ["a", "b"]

संपादित करें: आप फैलाने वाले सिंटैक्स का उपयोग करके पुनरावृत्त वस्तु को सरणी में भी परिवर्तित कर सकते हैं

let keys =[ ...myMap.keys() ];
// ["a", "b"]

6
मुझे स्प्रेड ऑपरेटर का उपयोग पसंद है, हालांकि, मेरा टाइपस्क्रिप्ट ट्रांसपिलर फेंकता है this.map.values().slice is not a function। शायद मुझे अपडेट करना चाहिए।
कोडी

4
@ कोडी क्योंकि आपके slice()मंगलाचरण को प्रसार ऑपरेटर से पहले निष्पादित किया जा रहा है। कोशिश करें[ ... Array.from(map.values()).slice(0) ]
mgthomas99

5
टाइपस्क्रिप्ट 2.7.2 इसके लिए कहता है: const fooMap = new Map<number, string>(); const fooArray = [...fooMap.keys()];निम्नलिखित: TS2461: टाइप करें 'IterableIterator <संख्या>' कोई प्रकार नहीं है। इसलिए टाइपस्क्रिप्ट में इसकी अनुमति नहीं है। Array.from उम्मीद के मुताबिक काम करता है।
स्टीफन रिन

@StefanRein टाइपस्क्रिप्ट प्रसार ऑपरेटर वह एक ही दिखता है, लेकिन ES6 प्रसार के बराबर नहीं है, क्योंकि यह केवल एरे और ऑब्जेक्ट प्रकार के साथ काम करता है, जबकि ES6 किसी भी चलने के साथ काम करता है। आप ईएस 6 में ..."abc"प्राप्त करने के लिए कर सकते हैं ["a","b","c"], जो टीएस में संभव नहीं है।
पावेल

@ पावेल ..."abc"...("abc")तो क्रोम कंसोल में काम कर रहे हैं, जो ईएस 6 का समर्थन करता है?
स्टीफन रीन

15

आप एक सरणी में Map.keys () पुनरावृत्ति में कनवर्ट करने के लिए प्रसार ऑपरेटर का उपयोग कर सकते हैं ।

let myMap = new Map().set('a', 1).set('b', 2).set(983, true)
let keys = [...myMap.keys()]
console.log(keys)


6

Array.from(myMap.keys()) Google एप्लिकेशन स्क्रिप्ट में काम नहीं करता है।

इसका उपयोग करने की कोशिश करने से त्रुटि उत्पन्न होती है TypeError: Cannot find function from in object function Array() { [native code for Array.Array, arity=1] }

GAS में कुंजियों की सूची प्राप्त करने के लिए ऐसा करें:

var keysList = Object.keys(myMap);

यह एक मेरे लिए काम करता है, और पहला जवाब नहीं था। मैं Google का उपयोग नहीं कर रहा हूं ... लेकिन यह कहते हुए एक त्रुटि प्राप्त करता रहा कि map.keys()रिटर्न वैल्यू चलने योग्य नहीं है।
Azurespot

5

मुझे कोणीय प्रतिक्रियाशील रूप के साथ कुछ परिचित होने की आवश्यकता है:

let myMap = new Map().set(0, {status: 'VALID'}).set(1, {status: 'INVALID'});
let mapToArray = Array.from(myMap.values());
let isValid = mapToArray.every(x => x.status === 'VALID');

2

सवाल का सबसे अच्छा जवाब नहीं, लेकिन इस ट्रिक new Array(...someMap)ने मुझे कई बार बचाया जब मुझे आवश्यक सरणी उत्पन्न करने के लिए कुंजी और मूल्य दोनों की आवश्यकता थी। उदाहरण के लिए जब कुंजी और मान दोनों के आधार पर मैप ऑब्जेक्ट से प्रतिक्रिया घटक बनाने की आवश्यकता होती है।

  let map = new Map();
  map.set("1", 1);
  map.set("2", 2);
  console.log(new Array(...map).map(pairs => pairs[0])); -> ["1", "2"]

1

ठीक है, आइए थोड़ा और अधिक विस्तृत करें और उन लोगों के लिए मानचित्र के साथ शुरू करें जो जावास्क्रिप्ट में इस सुविधा को नहीं जानते हैं ... एमडीएन कहते हैं:

मैप ऑब्जेक्ट कुंजी-मूल्य जोड़े रखता है और कुंजी के मूल सम्मिलन क्रम को याद रखता है।
किसी भी मूल्य (दोनों वस्तुओं और आदिम मूल्यों) को एक कुंजी या एक मूल्य के रूप में इस्तेमाल किया जा सकता है।

जैसा कि आपने उल्लेख किया है, आप आसानी से नए कीवर्ड का उपयोग करके मानचित्र का एक उदाहरण बना सकते हैं ... आपके मामले में:

let myMap = new Map().set('a', 1).set('b', 2);

तो चलिए देखते हैं ...

जिस तरह से आपने उल्लेख किया है वह इसे करने का एक ठीक तरीका है, लेकिन हां, ऐसा करने के लिए और अधिक संक्षिप्त तरीके हैं ...

मानचित्र में कई विधियाँ हैं जिनका आप उपयोग कर सकते हैं, जैसे set()कि आप पहले से ही प्रमुख मूल्यों को निर्दिष्ट करने के लिए उपयोग करते हैं ...

उनमें से एक है keys()जो सभी चाबियाँ लौटाता है ...

आपके मामले में, यह वापस आ जाएगा:

MapIterator {"a", "b"}

और आप आसानी से उन्हें फैलाने वाले ऑपरेटर की तरह ES6 तरीकों का उपयोग करके एक ऐरे में परिवर्तित कर सकते हैं ...

const b = [...myMap.keys()];
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.