कन्वर्ट ES6 सरणी के लिए Iterable


100

मान लीजिए कि आपके पास एक सरणी-जैसा जावास्क्रिप्ट ES6 Iterable है, जिसे आप पहले से जानते हैं कि लंबाई में परिमित होगा, इसे एक जावास्क्रिप्ट सरणी में बदलने का सबसे अच्छा तरीका क्या है?

ऐसा करने का कारण यह है कि कई जेएस पुस्तकालयों जैसे अंडरस्कोर और लॉश केवल एरे का समर्थन करते हैं, इसलिए यदि आप किसी Iterable पर उनके किसी भी कार्य का उपयोग करना चाहते हैं, तो उसे पहले एक ऐरे में बदलना होगा।

अजगर में आप केवल सूची () फ़ंक्शन का उपयोग कर सकते हैं। ES6 में एक बराबर है?


जवाबों:


156

आप Array.from या स्प्रेड ऑपरेटर का उपयोग कर सकते हैं ।

उदाहरण:

let x = new Set([ 1, 2, 3, 4 ]);

let y = Array.from(x);
console.log(y); // = [ 1, 2, 3, 4 ]

let z = [ ...x ];
console.log(z); // = [ 1, 2, 3, 4 ]


2
लगभग उसी ES6 पर लागू होता है let m = new Map()डेटा संरचना: नक्शा, उपयोग की सिर्फ मूल्यों को प्राप्त करने के लिए Array.fromया पर फैल ऑपरेटर m.values()के लिए एक ही है, m.keys()। अन्यथा, आपको सारणियों का एक सरणी मिलेगा [[key, value], [key, value]]:।
निक सुमिको

17

सारांश:

  • Array.from() फ़ंक्शन, यह इनपुट के रूप में एक पुनरावृत्ति लेता है और पुनरावृत्ति की एक सरणी देता है।
  • प्रसार ऑपरेटर: ...एक सरणी शाब्दिक संयोजन में।

const map = new Map([[ 1, 'one' ],[ 2, 'two' ]]);

const newArr1  = [ ...map  ];  // create an Array literal and use the spread syntax on it
const newArr2 = Array.from( map );  // 

console.log(newArr1, newArr2); 

सरणियों की नकल करते समय चेतावनी:

इस तथ्य से संज्ञान लें कि इन तरीकों के माध्यम से केवल एक उथले प्रतिलिपि बनाई जाती है जब हम एक सरणी की प्रतिलिपि बनाना चाहते हैं। एक उदाहरण संभावित मुद्दे को स्पष्ट करेगा:

let arr = [1, 2, ['a', 'b']];

let newArr = [ ...arr ];

console.log(newArr);

arr[2][0] = 'change';

console.log(newArr);

यहां नेस्टेड सरणी के कारण संदर्भ की प्रतिलिपि बनाई गई है और कोई नया सरणी नहीं बनाया गया है। इसलिए यदि हम पुराने सरणी के नेस्टेड सरणी को म्यूट करते हैं, तो यह परिवर्तन नए सरणी में दिखाई देगा (क्योंकि वे उसी सरणी को संदर्भित करते हैं, संदर्भ कॉपी किया गया था)।

चेतावनी के लिए समाधान:

हम सरणी का एक गहरा क्लोन बनाकर उथली प्रतियां होने के मुद्दे को हल कर सकते हैं JSON.parse(JSON.stringify(array))। उदाहरण के लिए:

let arr = [1, 2, ['a', 'b']]

let newArr = Array.from(arr);

let deepCloneArr = JSON.parse(JSON.stringify(arr));

arr[2][0] = 'change';

console.log(newArr, deepCloneArr)


12

आप Array.from पद्धति का उपयोग कर सकते हैं , जिसे ES6 में जोड़ा जा रहा है, लेकिन केवल मैप्स और सेट्स (जैसे ES6 में आने वाली) जैसी सरणियों और चलने योग्य वस्तुओं का समर्थन करता है। नियमित रूप से वस्तुओं के लिए, आप अंडरस्कोर का उपयोग कर सकते toArray , विधि या lodash के toArray विधि के बाद से दोनों पुस्तकालयों वास्तव में वस्तुओं, न सिर्फ सरणियों के लिए महान समर्थन है। यदि आप पहले से ही अंडरस्कोर या लॉश का उपयोग कर रहे हैं, तो सौभाग्य से वे आपके लिए समस्या को संभाल सकते हैं, साथ ही नक्शे जैसी विभिन्न कार्यात्मक अवधारणाओं को जोड़ सकते हैं और अपनी वस्तुओं के लिए कम कर सकते हैं।


3

मानचित्र के लिए निम्नलिखित दृष्टिकोण का परीक्षण किया गया है:

const MyMap = new Map([
  ['a', 1],
  ['b', 2],
  ['c', 3]
]);

const MyArray = [...MyMap].map(item => {
  return {[item[0]]: item[1]}
});

console.info( MyArray ); //[{"a", 1}, {"b", 2}, {"c": 3}]

क्या नहीं पूछा गया था - Array.from तरीका देखें
João Antunes


-4

आप भी कर सकते हैं:

let arr = [];
for (let elem of gen(...)){
    arr.push(elem);
}

या ES5 + जनरेटर फ़ंक्शन का उपयोग करके "कठिन रास्ता" ( वर्तमान फ़ायरफ़ॉक्स में फ़िडल काम करता है):

var squares = function*(n){
    for (var i=0; i<n; i++){
        yield i*i;
    }
}

var arr = [];
var gen = squares(10);
var g;
while(true){
    g = gen.next();
    if (g.done){
        break;
    }
    arr.push(g.value);
}

दोनों दृष्टिकोण निश्चित रूप से अनुशंसित नहीं हैं, लेकिन केवल एक सबूत की अवधारणा है।

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