অ্যারেতে সেট কীভাবে রূপান্তর করবেন?


469

সেটটি গ্যারান্টিযুক্ত অনন্য উপাদানগুলির সাথে অ্যারে তৈরির দুর্দান্ত পদ্ধতির মতো বলে মনে হয় তবে এটি জেনারেটর [সেট]। মূল্যবোধ ব্যতীত বৈশিষ্ট্যগুলি পাওয়ার কোনও ভাল উপায় প্রকাশ করে না, যাকে বলা হয় একটি বিশ্রী পদ্ধতিতে mySet.values.next()

এটি ঠিক আছে, যদি আপনি কল করতে mapএবং সেটে অনুরূপ ফাংশন করতে পারতেন । তবে আপনি তাও করতে পারবেন না।

আমি চেষ্টা করেছি Array.from, তবে মনে হচ্ছে কেবল অ্যারে-জাতীয় (নোডলিস্ট এবং টাইপড অ্যারে?) অবজেক্টগুলিকে অ্যারে রূপান্তর করা হচ্ছে। আর একটি চেষ্টা করুন: Object.keysসেটগুলির জন্য কাজ করে না এবং সেট.প্রোটোটাইপের একই ধরণের স্ট্যাটিক পদ্ধতি নেই।

সুতরাং, প্রশ্ন: প্রদত্ত সেটের মান সহ একটি অ্যারে তৈরি করার জন্য কি কোনও সুবিধাজনক ইনবিল্ট পদ্ধতি আছে? (উপাদানটির অর্ডার আসলে কোনও বিষয় নয়)।

যদি এই জাতীয় কোনও বিকল্প উপস্থিত না থাকে, তবে সম্ভবত এটি করার জন্য একটি দুর্দান্ত আইডোম্যাটিক ওয়ান-লাইনার রয়েছে? মত, ব্যবহার for...of, বা অনুরূপ?

উত্তর:


849

যদি এই জাতীয় কোনও বিকল্প উপস্থিত না থাকে, তবে সম্ভবত এটি করার জন্য একটি দুর্দান্ত আইডোম্যাটিক ওয়ান-লাইনার রয়েছে? যেমন ... এর জন্য ব্যবহার করছেন, বা অনুরূপ?

প্রকৃতপক্ষে, একটি রূপান্তর করার বিভিন্ন উপায় আছে সেট একটি থেকে এরে :

ব্যবহার 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) বা Chrome (41) এ কাজ করে না। তবে এটি ফায়ারফক্সে (35) কাজ করে।
425nesp

2
var array = [v for (v of mySet)];ক্রোম 46 এ কাজ করে না
এরিক

18
আমি মনে করি সবচেয়ে মার্জিত উপায় সহজভাবে [...mySet]
ভোজসিচ বেদনারস্কি

18
@WojciechBednarski l33t নয় মার্জিত । উদাহরণগুলির মধ্যে যদি এটির কোনও হয় তবে তা Array.from(mySet);
মহিষ 6

3
[...mySet]টাইপসক্রিপ্ট ব্যবহার করে সংকলিত করার সময় যে সমস্যাগুলি রয়েছে তা কেবল যুক্ত করতে চেয়েছিলেন ( এই সমস্যাটি দেখুন ), Array.from(mySet)যদি আপনি অদূর ভবিষ্যতে টাইপসক্রিপ্টে রূপান্তর করতে চান তবে সম্ভবত ব্যবহার করা নিরাপদ ।
ইভান গোজালি

65

অ্যাঙ্গাস ক্রোল দ্বারা https://speakerdeck.com/anguscrol/es6- ইউনিক্সর এর মাধ্যমে

দেখা যাচ্ছে, আমরা spreadঅপারেটরটি ব্যবহার করতে পারি :

var myArr = [...mySet];

অথবা, বিকল্পভাবে, ব্যবহার করুন Array.from:

var myArr = Array.from(mySet);

1
কেন ডাউনটা? এই পদ্ধতির সাথে কোনও সমস্যা আছে? অথবা কেউ আই 11 এ এই কোডটি কার্যকর করার চেষ্টা করেছিল এবং ব্যর্থ হয়েছিল ? ;)
c69

6
আমি ডাউনोट করি নাই, তবে আমি Chrome এর সর্বশেষতম সংস্করণে চেষ্টা করেছিলাম এবং ব্যর্থ হয়েছি, সুতরাং এটি কেবল কোনও আইই সমস্যা নয়।
মেশাল

3
পড়ুন kangax.github.io/compat-table/es6 বেশী বা কম আপ-টু-ডেট সমর্থন চার্ট জন্য। বর্তমানে, সমস্ত ডেস্কটপ ব্রাউজারগুলির মধ্যে কেবল এফএফ এবং আইই টিপি (ওরফে স্পার্টান, ওরফে এমএস নন-আইই ব্রাউজার) সমর্থন Array.fromএবং...
c69

দেখে মনে হচ্ছে ফায়ারফক্স একমাত্র ব্রাউজার সমর্থন করে Array.fromবিকাশকারী.মোজিলা.আর.ইন-
ইউএস

1
এখানে আপনি এটি Chrome এর জন্য সক্ষম করতে পারেন chrome://flags/#enable-javascript-harmonyমনে রাখবেন এটি পরীক্ষামূলকভাবে মুহূর্তের জন্য ভাবেন না যে এটি উন্নয়নের জন্য ভাল সমাধান।
সোসপেরা

12

ধরে নিই যে আপনি অ্যারাইতে Setঅনন্য মানগুলি পেতে সাময়িকভাবে ব্যবহার করছেন এবং তারপরে আবার অ্যারেতে রূপান্তর করছেন, এটি ব্যবহার করে দেখুন:

_.uniq([])

এটি আন্ডারস্কোর বা লো-ড্যাশ ব্যবহারের উপর নির্ভর করে ।


দুর্ভাগ্যক্রমে একমাত্র ক্রস-ব্রোজার সমাধান
মার্কো

6

পার্টিতে দেরি হতে পারে তবে আপনি কেবল নিম্নলিখিতটি করতে পারেন:

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

এটি ES6 এর জন্য সমর্থনযুক্ত ব্রাউজারগুলিতে সমস্যা ছাড়াই বা আপনার যদি এমন কোনও শিম থাকে যা উপরের কার্যকারিতাটি সঠিকভাবে পলফিল করে work

সম্পাদনা করুন : আজ আপনি @ সি 69 এর পরামর্শ অনুসারে কেবল ব্যবহার করতে পারেন:

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

1
মনে হচ্ছে এটি ব্যবহার করে set.entries()আপনি জোড়গুলির অ্যারে পাবেন। আপনি set.values()প্লেইন অ্যারে পেতে ব্যবহার করতে পারেন ।
শিমন রাচলেঙ্কো

@ শিমন রাচলেনকো সত্য, এবং ব্যবহারকারী এটি চেয়েছিলেন।
রোল্যান্ড

2
আপনি কেবল ব্যবহার করতে পারেনvar array = Array.from(set);
বাফেলো

এই উত্তর ঠিক ভুল। আপনার কাছে কল করার দরকার .entriesনেই, নাও .values। যেমন উপরে বর্ণিত @ বুফালো - Array.from(set)যথেষ্ট is
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);

মান 1 সমান মান 2 => সেটে বর্তমান অবস্থানে থাকা মানটি। উভয় যুক্তির জন্য একই মান পাস করা হয়

আইই ১১ এর অধীনে কাজ করেছেন।


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
.. আর এ কি?
জেডএফ 1007

-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.

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.