জাভাস্ক্রিপ্টে কোনও সেট কীভাবে মানচিত্র / হ্রাস / ফিল্টার করবেন?


131

জাভাস্ক্রিপ্টে map/ reduce/ filter/ ইত্যাদি কোনও উপায় আছে Setবা আমার নিজের লিখতে হবে?

এখানে কিছু বুদ্ধিমান Set.prototypeএক্সটেনশন রয়েছে

Set.prototype.map = function map(f) {
  var newSet = new Set();
  for (var v of this.values()) newSet.add(f(v));
  return newSet;
};

Set.prototype.reduce = function(f,initial) {
  var result = initial;
  for (var v of this) result = f(result, v);
  return result;
};

Set.prototype.filter = function filter(f) {
  var newSet = new Set();
  for (var v of this) if(f(v)) newSet.add(v);
  return newSet;
};

Set.prototype.every = function every(f) {
  for (var v of this) if (!f(v)) return false;
  return true;
};

Set.prototype.some = function some(f) {
  for (var v of this) if (f(v)) return true;
  return false;
};

একটু সেট করা যাক

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

এবং কিছু বোকা সামান্য ফাংশন

const times10 = x => x * 10;
const add = (x,y) => x + y;
const even = x => x % 2 === 0;

এবং দেখুন তারা কীভাবে কাজ করে

s.map(times10);    //=> Set {10,20,30,40}
s.reduce(add, 0);  //=> 10
s.filter(even);    //=> Set {2,4}
s.every(even);     //=> false
s.some(even);      //=> true

সুন্দর না? হ্যাঁ, আমিও তাই মনে করি। কুরুচিপূর্ণ পুনরায় ব্যবহারকারীর সাথে এর তুলনা করুন

// puke
let newSet = new Set();
for (let v in s) {
  newSet.add(times10(v));
}

এবং

// barf
let sum = 0;
for (let v in s) {
  sum = sum + v;
}

জাভাস্ক্রিপ্টে কোনও সফল করার জন্য mapএবং reduceব্যবহার করার আরও ভাল কোনও উপায় আছে কি Set?


মানচিত্র-হ্রাস-ইন-এ সমস্যাটি Setহ'ল সেটগুলি ফ্যান্টেক্টর নয়।
বারটেক বানাচিউইচ

@ বারটেকবাঞ্চেউইচজ হ্যাঁ এ জাতীয় সমস্যা ... তাই না?
আপনাকে ধন্যবাদ

2
ঠিক আছে, বিবেচনা করুন var s = new Set([1,2,3,4]); s.map((a) => 42);। এটি উপাদানগুলির সংখ্যা পরিবর্তন করে, যা mapসাধারণত করা উচিত নয়। আরও খারাপ যদি আপনি কেবল রক্ষিত অবজেক্টের কিছু অংশের সাথে তুলনা করেন, কারণ প্রযুক্তিগতভাবে এটি অনির্দিষ্ট un
বারটেক বানাচিউইচ

আমি এটি বিবেচনা করেছি, তবে আমি নিশ্চিত নই যে আমি (ব্যক্তিগতভাবে) এটিকে অবৈধ মনে করব। ঠিক আছে forEach, তবে কমপক্ষে সেই দৃশ্যের জন্য বিদ্যমান, তবে কেন নেই reduce?
আপনাকে ধন্যবাদ

উত্তর:


105

এটি করার একটি স্বল্প হাতের উপায় হ'ল ES6 স্প্রেড অপারেটরের মাধ্যমে এটিকে অ্যারেতে রূপান্তর করা।

তারপরে সমস্ত অ্যারে ফাংশন আপনার জন্য উপলব্ধ।

const mySet = new Set([1,2,3,4]);
[...mySet].reduce()

1
কারণ ফাংশন সেট জন্য উপলব্ধ না! এটি একটি সম্পূর্ণ, গাইডেড এবং বোঝা যায় এমন কাজ যা এখনও এই বিষয়টিতে উপস্থিত নেই। সেটটি এই বৈশিষ্ট্যগুলি প্রয়োগ না করা অবধি কাজের জন্য মূল্য পরিশোধের দুঃখজনক মূল্য!
জেফডাভিজ

1
এই এবং Array.from মধ্যে পার্থক্য কি
পিট

9
আমার পক্ষে কমপক্ষে, এর মধ্যে পার্থক্য এবং Array.fromএটি হ'ল Array.fromটাইপস্ক্রিপ্টের সাথে কাজ করে। ব্যবহার [...mySet]ত্রুটি দেয়:TS2461: Type 'Set<number>' is not an array type.
মিকাল ম্যাডসেন

1
বিস্তার বনাম Array.from জন্য (), দেখতে stackoverflow.com/a/40549565/5516454 মূলত উভয় এখানে ব্যবহারযোগ্য করে। অ্যারে.ফ্রম () অতিরিক্তভাবে অ্যারে-জাতীয় বস্তুগুলি করতে পারে যা @@iteratorপদ্ধতিটি বাস্তবায়ন করে না ।
জেফডাভিজ

এখনও টাইপস্ক্রিপ্ট দিয়ে আমার জন্য কাজ করে না। আমি পেয়েছিERROR TypeError: this.sausages.slice is not a function
সাইমন_উইভার

22

মন্তব্যগুলি থেকে আলোচনার সংক্ষিপ্তসার জন্য: যদিও কোনও প্রযুক্তিগত কারণ না রয়েছে তা নির্ধারণের জন্য reduceবর্তমানে এটি সরবরাহ করা হয়নি এবং আমরা কেবল আশা করতে পারি এটি ES7 এ পরিবর্তিত হয়েছে।

হিসাবে map, একা এটি কল লঙ্ঘন করতে পারেSet সীমাবদ্ধতা তাই এখানে এর উপস্থিতি বিতর্কযোগ্য হতে পারে।

কোনও ফাংশন সহ ম্যাপিংয়ের কথা বিবেচনা করুন (a) => 42- এটি সেটটির আকার 1 এ পরিবর্তন করবে এবং এটি আপনি যা চেয়েছিলেন তা হতে পারে বা নাও পারে।

যদি আপনি এটি লঙ্ঘন করে ঠিক থাকেন কারণ যেমন আপনি যে কোনও উপায়ে ভাঁজ করতে চলেছেন, আপনি mapপ্রতিটি উপাদানগুলিতে স্থান দেওয়ার ঠিক আগে অংশটি প্রয়োগ করতে পারেন reduce, সুতরাং মধ্যবর্তী সংগ্রহ ( যা এই মুহুর্তে কোনও সেট নয় ) স্বীকার করে নিন হ্রাস হতে চলেছে নকল উপাদান থাকতে পারে। এটি প্রক্রিয়াকরণ করতে অ্যারেতে রূপান্তর করার সমতুল্য।


1
এই ছাড়া (উপরের কোড ব্যবহার করে), বেশিরভাগ ভাল, s.map(a => 42)পরিণাম ডেকে আনবে Set { 42 }তাই ম্যাপ ফলাফলের একটি ভিন্ন দৈর্ঘ্য হবে কিন্তু সেখানে হবে না "সদৃশ" উপাদান। সম্ভবত শব্দটি আপডেট করুন এবং আমি এই উত্তরটি গ্রহণ করব।
আপনাকে ধন্যবাদ

@naomik ওহ ডের্প আমি যখন আমার প্রথম কফিটি লিখছিলাম তখন তা শেষ করছিলাম। দ্বিতীয় বর্ণনায়, মধ্যবর্তী সংগ্রহ কমাতে পাস করার জন্য তাত্ক্ষণিক উপাদান থাকতে পারে যদি আপনি এটি সেট না হিসাবে গ্রহণ করেন - এটাই আমার অর্থ।
বারটেক বানাচেউইচজ

ওহ আমি এটি পেয়েছি - মানচিত্রে একই ধরণের মানচিত্র তৈরি করতে হবে, তাই গন্তব্য সেটে সম্ভাব্য সংঘর্ষগুলি। যখন আমি এই প্রশ্নটি পেয়েছি আমি ভাবছিলাম মানচিত্রটি কোনও সেট থেকে একটি অ্যারেতে মানচিত্র করবে would (যেন আপনি সেট করেছেন। টু অরে ()। মানচিত্র () `
সাইমন_উইভার

2
স্কালা এবং হাস্কেল-এ সেটগুলি মানচিত্রের ক্রিয়াকলাপ সমর্থন করে - এটি সেটে উপাদানগুলির সংখ্যা হ্রাস করতে পারে।
ভেলিজার হরিস্টভ

8

map/ reduce/ filterঅন Map/ Setসংগ্রহের অভাবের কারণটি মূলত ধারণামূলক উদ্বেগ বলে মনে হয়। জাভাস্ক্রিপ্টে প্রতিটি সংগ্রহের টাইপ করা উচিত কেবল এটির অনুমতি দেওয়ার জন্য তার নিজস্ব পুনরাবৃত্ত পদ্ধতিগুলি নির্দিষ্ট করে

const mySet = new Set([1,2,3]);
const myMap = new Map([[1,1],[2,2],[3,3]]);

mySet.map(x => x + 1);
myMap.map(([k, x]) => [k, x + 1]);

পরিবর্তে

new Set(Array.from(mySet.values(), x => x + 1));
new Map(Array.from(myMap.entries(), ([k, x]) => [k, x + 1]));

একটি বিকল্প মানচিত্র উল্লেখ / iterable / পুনরুক্তিকারীর প্রোটোকল অংশ হিসেবে ফিল্টার কমাতে /, ছিল যেহেতু entries/ values/keys রিটার্ন Iteratorএস। এটি অনুমেয় যে যদিও প্রতিটি পুনরাবৃত্তীয় "ম্যাপযোগ্য" নয়। অন্য বিকল্পটি হ'ল এই উদ্দেশ্যেই একটি পৃথক "সংগ্রহ প্রোটোকল" নির্দিষ্ট করা হয়েছিল।

তবে ইএস-তে এই বিষয়টির বর্তমান আলোচনা আমি জানি না।

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