सेट को एरे में कैसे बदलें?


469

सेट अद्वितीय तत्वों की गारंटी के साथ Arrays बनाने के लिए एक अच्छा तरीका की तरह लगता है, लेकिन यह जनरेटर [सेट] .values ​​को छोड़कर गुणों को प्राप्त करने के लिए किसी भी अच्छे तरीके को उजागर नहीं करता है, जिसे अजीब तरीके से कहा जाता है mySet.values.next()

यह ठीक होता, यदि आप mapसेट्स पर कॉल और इसी तरह के फंक्शन कर सकते थे । लेकिन आप ऐसा नहीं कर सकते।

मैंने कोशिश की है Array.from, लेकिन सरणी को केवल सरणी-जैसे (नोडलिस्ट और टाइपेडर्रे?) वस्तुओं में परिवर्तित किया जा रहा है । एक और कोशिश: Object.keysसेट्स के लिए काम नहीं करता है, और सेट.प्रोटोटाइप में समान स्थिर विधि नहीं है।

तो, सवाल: किसी दिए गए सेट के मूल्यों के साथ एक ऐरे बनाने के लिए कोई सुविधाजनक इनबिल्ट विधि है? (तत्व का क्रम वास्तव में मायने नहीं रखता है)।

यदि ऐसा कोई विकल्प मौजूद नहीं है, तो हो सकता है कि ऐसा करने के लिए एक अच्छा मुहावरेदार वन-लाइनर हो? जैसे, का उपयोग for...of, या समान?

जवाबों:


850

यदि ऐसा कोई विकल्प मौजूद नहीं है, तो हो सकता है कि ऐसा करने के लिए एक अच्छा मुहावरेदार वन-लाइनर हो? जैसे ... के लिए, या समान का उपयोग कर?

दरअसल, सेट को एक ऐरे में बदलने के कई तरीके हैं :

का उपयोग करते हुए Array.from

let array = Array.from(mySet);

बस spreadingएक सरणी में सेट बाहर

let array = [...mySet];

पुराने फैशन का तरीका, पुनरावृत्ति करना और एक नई सरणी में धकेलना (सेट्स में है forEach)

let array = [];
mySet.forEach(v => array.push(v));

पहले, गैर-मानक का उपयोग करके, और अब पदावनत किए गए एरे को समझने का सिंटैक्स:

let array = [v for (v of mySet)];

7
यह सफारी (8) या क्रोम (41) में काम नहीं करता है। लेकिन यह फ़ायरफ़ॉक्स (35) में काम करता है।
425nesp

2
var array = [v for (v of mySet)];क्रोम में काम नहीं करता है 46
एरिक

18
मुझे लगता है कि सबसे सुंदर तरीका बस है [...mySet]
वोज्शिएक बेडनरस्की

18
@WojciechBednarski l33t सुरुचिपूर्ण नहीं है । यदि कोई भी उदाहरण है, तो यह हैArray.from(mySet);
बफ़ेलो

3
[...mySet]जब टाइपस्क्रिप्ट ( इस मुद्दे को देखें ) का उपयोग करके संकलित किए गए मुद्दों को जोड़ना चाहते थे , तो संभवत: Array.from(mySet)यदि आप निकट भविष्य में टाइपस्क्रिप्ट में बदलने का इरादा रखते हैं तो उपयोग करना सुरक्षित है ।
इवान गोज़ली

65

https://speakerdeck.com/anguscroll/es6-uncensored के माध्यम से एंगस क्रॉल

यह पता चला है, हम spreadऑपरेटर का उपयोग कर सकते हैं :

var myArr = [...mySet];

या, वैकल्पिक रूप से, उपयोग करें Array.from:

var myArr = Array.from(mySet);

1
एक नीचता क्यों? इस दृष्टिकोण के साथ कोई समस्या है? या किसी ने IE11 में इस कोड को निष्पादित करने की कोशिश की और असफल रहा ? ;)
c69

6
मैंने इसे कम नहीं किया, लेकिन मैंने क्रोम के नवीनतम संस्करण में इसकी कोशिश की और असफल रहा, इसलिए यह केवल IE मुद्दा नहीं है।
मशाल

3
अधिक या कम अप-टू-डेट समर्थन चार्ट के लिए kangax.github.io/compat-table/es6 देखें । वर्तमान में, सभी डेस्कटॉप ब्राउज़रों में, केवल एफएफ और आईई टीपी (उर्फ स्पार्टन, उर्फ ​​एमएस नॉन-आईई ब्राउजर) समर्थन Array.fromऔर...
c69

लगता है कि फ़ायरफ़ॉक्स समर्थन करने वाला एकमात्र ब्राउज़र है Array.fromdeveloper.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
425nesp

1
यहां आप इसे Chrome के लिए सक्षम कर सकते हैं chrome://flags/#enable-javascript-harmonyयाद रखें यह प्रायोगिक है कि इस क्षण के लिए मत सोचो कि यह विकास के लिए एक अच्छा समाधान है।
sospedra

12

मान लें कि आप Setकिसी सरणी में अनन्य मान प्राप्त करने के लिए केवल अस्थायी रूप से उपयोग कर रहे हैं और फिर वापस एक सरणी में परिवर्तित कर रहे हैं, इसका उपयोग करने का प्रयास करें:

_.uniq([])

यह अंडरस्कोर या लो-डैश का उपयोग करने पर निर्भर करता है ।


केवल एकमात्र क्रॉस-ब्रोसर समाधान
मार्को सुल्टा

6

शायद पार्टी के लिए देर हो चुकी है, लेकिन आप बस निम्नलिखित कर सकते हैं:

const set = new Set(['a', 'b']);
const values = set.values();
const array = Array.from(values);

यह उन ब्राउज़र में समस्याओं के बिना काम करना चाहिए जिनके पास ES6 के लिए समर्थन है या यदि आपके पास एक शिम है जो उपरोक्त कार्यक्षमता को सही ढंग से पॉलीफ़िल करता है।

संपादित करें : आज आप @ c69 के सुझाव का उपयोग कर सकते हैं:

const set = new Set(['a', 'b']);
const array = [...set]; // or Array.from(set)

1
ऐसा लगता है कि set.entries()आप का उपयोग करके जोड़े की सरणी मिल जाएगी। आप set.values()सादे सरणी प्राप्त करने के लिए उपयोग कर सकते हैं ।
शिमोन रैचलेंको

@ShimonRachlenko सच है, और उपयोगकर्ता उस के लिए पूछा था।
रोलैंड

2
आप बस उपयोग कर सकते हैंvar array = Array.from(set);
भैंस

यह उत्तर गलत है। आपको कॉल करने की आवश्यकता नहीं है .entries, न ही .values। जैसा कि @ बफलो ने ऊपर उल्लेख किया है - Array.from(set)पर्याप्त है।
c69

1
@ c69 जो सच है। इस उत्तर के समय, Array.from()अपेक्षा के अनुरूप काम नहीं किया। लेकिन अब फैल गया है और Array.from()दोनों ही ठीक काम करते हैं।
रोलैंड


0

मेरे मामले में समाधान था:

var testSet = new Set();
var testArray = [];

testSet.add("1");
testSet.add("2");
testSet.add("2"); // duplicate item
testSet.add("3");

var someFunction = function (value1, value2, setItself) {
    testArray.push(value1);
};

testSet.forEach(someFunction);

console.log("testArray: " + testArray);

value1 बराबर value2 => सेट में वर्तमान स्थिति में निहित मूल्य। दोनों तर्कों के लिए समान मूल्य पारित किया जाता है

IE11 के तहत काम किया।


0

सेट का उपयोग करना और इसे एक सरणी में परिवर्तित करना एक ऐरे को कॉपी करने के समान है ...

तो आप एक सरणी की प्रतिलिपि बनाने के लिए समान विधियों का उपयोग कर सकते हैं जो ES6 में बहुत आसान है

उदाहरण के लिए, आप उपयोग कर सकते हैं ...

कल्पना कीजिए कि आपके पास यह सेट नीचे है:

const a = new Set(["Alireza", "Dezfoolian", "is", "a", "developer"]);

आप बस इसका उपयोग करके परिवर्तित कर सकते हैं:

const b = [...a];

और परिणाम है:

["Alireza", "Dezfoolian", "is", "a", "developer"]

एक सरणी और अब आप उन सभी विधियों का उपयोग कर सकते हैं जिन्हें आप किसी सरणी के लिए उपयोग कर सकते हैं ...

इसे करने के अन्य सामान्य तरीके:

const b = Array.from(a);

या छोरों का उपयोग करना जैसे:

const b = [];
a.forEach(v => b.push(v));

0

नीचे दिए गए कोड ...ऑपरेटर का उपयोग करके एक सरणी से एक सेट बनाता है और फिर ।

var arr=[1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9,];
var set=new Set(arr);
let setarr=[...set];
console.log(setarr);

कृपया अपना कोड नीचे टिप्पणी करें।
हेमांक

1
..और यह क्या है?
ZF007

-1

यहाँ सरणी से केवल अनन्य कच्चे मान प्राप्त करने का एक आसान तरीका है। यदि आप सरणी को सेट में परिवर्तित करते हैं और इसके बाद, सेट से सरणी में रूपांतरण करते हैं। यह रूपांतरण केवल कच्चे मूल्यों के लिए काम करता है, सरणी में वस्तुओं के लिए यह मान्य नहीं है। इसे स्वयं करके देखें।

    let myObj1 = {
        name: "Dany",
        age: 35,
        address: "str. My street N5"
    }

    let myObj2 = {
        name: "Dany",
        age: 35,
        address: "str. My street N5"
    }

    var myArray = [55, 44, 65, myObj1, 44, myObj2, 15, 25, 65, 30];
    console.log(myArray);

    var mySet = new Set(myArray);
    console.log(mySet);

    console.log(mySet.size === myArray.length);// !! The size differs because Set has only unique items

    let uniqueArray = [...mySet];
    console.log(uniqueArray); 
    // Here you will see your new array have only unique elements with raw 
    // values. The objects are not filtered as unique values by Set.
    // Try it by yourself.

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