একটি রুপান্তর করার কোন প্রয়োজন নেই Mapএকটি মধ্যে Array। আপনি কেবল অবজেক্টগুলির জন্য তৈরি mapএবং filterফাংশন করতে পারেন Map:
function map(functor, object, self) {
var result = new Map;
object.forEach(function (value, key, object) {
result.set(key, functor.call(this, value, key, object));
}, self);
return result;
}
function filter(predicate, object, self) {
var result = new Map;
object.forEach(function (value, key, object) {
if (predicate.call(this, value, key, object)) result.set(key, value);
}, self);
return result;
}
উদাহরণস্বরূপ, আপনি !মানচিত্রের প্রতিটি প্রবেশের মানতে একটি ঠুং শব্দ (অর্থাত্ চরিত্র) যুক্ত করতে পারেন যার মূলটি আদিম।
var object = new Map;
object.set("", "empty string");
object.set(0, "number zero");
object.set(object, "itself");
var result = map(appendBang, filter(primitive, object));
alert(result.get("")); // empty string!
alert(result.get(0)); // number zero!
alert(result.get(object)); // undefined
function primitive(value, key) {
return isPrimitive(key);
}
function appendBang(value) {
return value + "!";
}
function isPrimitive(value) {
var type = typeof value;
return value === null ||
type !== "object" &&
type !== "function";
}
<script>
function map(functor, object, self) {
var result = new Map;
object.forEach(function (value, key, object) {
result.set(key, functor.call(this, value, key, object));
}, self || null);
return result;
}
function filter(predicate, object, self) {
var result = new Map;
object.forEach(function (value, key, object) {
if (predicate.call(this, value, key, object)) result.set(key, value);
}, self || null);
return result;
}
</script>
এছাড়াও আপনি যোগ করতে পারিনি mapএবং filterউপর পদ্ধতি Map.prototypeএটা ভাল পড়া করতে। যদিও এটি সাধারণত এখনো নেটিভ এগুলির নমুনা পরিবর্তন না করাই ভালো আমি বিশ্বাস করি যে একটি ব্যতিক্রম ক্ষেত্রে করা যেতে পারে mapএবং filterএর জন্য Map.prototype:
var object = new Map;
object.set("", "empty string");
object.set(0, "number zero");
object.set(object, "itself");
var result = object.filter(primitive).map(appendBang);
alert(result.get("")); // empty string!
alert(result.get(0)); // number zero!
alert(result.get(object)); // undefined
function primitive(value, key) {
return isPrimitive(key);
}
function appendBang(value) {
return value + "!";
}
function isPrimitive(value) {
var type = typeof value;
return value === null ||
type !== "object" &&
type !== "function";
}
<script>
Map.prototype.map = function (functor, self) {
var result = new Map;
this.forEach(function (value, key, object) {
result.set(key, functor.call(this, value, key, object));
}, self || null);
return result;
};
Map.prototype.filter = function (predicate, self) {
var result = new Map;
this.forEach(function (value, key, object) {
if (predicate.call(this, value, key, object)) result.set(key, value);
}, self || null);
return result;
};
</script>
সম্পাদনা: বার্গির উত্তরে তিনি সমস্ত পুনরাবৃত্তিযোগ্য বস্তুর জন্য জেনেরিক mapএবং filterজেনারেটর ফাংশন তৈরি করেছিলেন । এগুলি ব্যবহারের সুবিধাটি হ'ল যেহেতু তারা জেনারেটর ফাংশন, তাই তারা মধ্যবর্তী পুনরাবৃত্তিযোগ্য বস্তুগুলি বরাদ্দ করে না।
উদাহরণস্বরূপ, আমার mapএবং filterফাংশনগুলি উপরে বর্ণিত নতুন Mapঅবজেক্ট তৈরি করে। সুতরাং কলিং object.filter(primitive).map(appendBang)দুটি নতুন Mapবস্তু তৈরি করে:
var intermediate = object.filter(primitive);
var result = intermediate.map(appendBang);
মধ্যবর্তী পুনরাবৃত্তিযোগ্য বস্তু তৈরি ব্যয়বহুল। বার্গির জেনারেটর ফাংশনগুলি এই সমস্যার সমাধান করে। তারা মধ্যবর্তী বস্তু বরাদ্দ দেয় না তবে একজন পুনরাবৃত্তিকে তার মানগুলি পরের দিকে অলসভাবে খাওয়ানোর অনুমতি দেয়। এই ধরণের অপ্টিমাইজেশান কার্যকরী প্রোগ্রামিং ভাষাগুলিতে ফিউশন বা বন উজাড় হিসাবে পরিচিত এবং এটি প্রোগ্রামের কার্য সম্পাদনকে উল্লেখযোগ্যভাবে উন্নতি করতে পারে।
বার্গির জেনারেটর ফাংশনগুলির সাথে আমার একটাই সমস্যা হ'ল এগুলি Mapবস্তুর সাথে নির্দিষ্ট নয় । পরিবর্তে, তারা সমস্ত পুনরাবৃত্তিযোগ্য বস্তুর জন্য সাধারণীকরণ করা হয়। সুতরাং জোড়গুলির সাথে কলব্যাক ফাংশনগুলিকে কল করার পরিবর্তে (value, key)(যেমনটি আমি ম্যাপিংয়ের সময় আশা করব Map) এর পরিবর্তে এটি জোড়গুলির সাথে কলব্যাক ফাংশনগুলিকে কল করে (value, index)। অন্যথায়, এটি একটি দুর্দান্ত সমাধান এবং আমি যে সমাধানগুলি সরবরাহ করেছি তার মধ্যে এটি অবশ্যই ব্যবহারের পরামর্শ দেব।
সুতরাং এগুলি নির্দিষ্ট জেনারেটর ফাংশন যা আমি ম্যাপিং এবং Mapঅবজেক্টগুলি ফিল্টার করার জন্য ব্যবহার করব :
function * map(functor, entries, self) {
var that = self || null;
for (var entry of entries) {
var key = entry[0];
var value = entry[1];
yield [key, functor.call(that, value, key, entries)];
}
}
function * filter(predicate, entries, self) {
var that = self || null;
for (var entry of entries) {
var key = entry[0];
var value = entry[1];
if (predicate.call(that, value, key, entries)) yield [key, value];
}
}
function toMap(entries) {
var result = new Map;
for (var entry of entries) {
var key = entry[0];
var value = entry[1];
result.set(key, value);
}
return result;
}
function toArray(entries) {
var array = [];
for (var entry of entries) {
array.push(entry[1]);
}
return array;
}
সেগুলি নিম্নলিখিত হিসাবে ব্যবহার করা যেতে পারে:
var object = new Map;
object.set("", "empty string");
object.set(0, "number zero");
object.set(object, "itself");
var result = toMap(map(appendBang, filter(primitive, object.entries())));
alert(result.get("")); // empty string!
alert(result.get(0)); // number zero!
alert(result.get(object)); // undefined
var array = toArray(map(appendBang, filter(primitive, object.entries())));
alert(JSON.stringify(array, null, 4));
function primitive(value, key) {
return isPrimitive(key);
}
function appendBang(value) {
return value + "!";
}
function isPrimitive(value) {
var type = typeof value;
return value === null ||
type !== "object" &&
type !== "function";
}
<script>
function * map(functor, entries, self) {
var that = self || null;
for (var entry of entries) {
var key = entry[0];
var value = entry[1];
yield [key, functor.call(that, value, key, entries)];
}
}
function * filter(predicate, entries, self) {
var that = self || null;
for (var entry of entries) {
var key = entry[0];
var value = entry[1];
if (predicate.call(that, value, key, entries)) yield [key, value];
}
}
function toMap(entries) {
var result = new Map;
for (var entry of entries) {
var key = entry[0];
var value = entry[1];
result.set(key, value);
}
return result;
}
function toArray(entries) {
var array = [];
for (var entry of entries) {
array.push(entry[1]);
}
return array;
}
</script>
আপনি যদি আরও সাবলীল ইন্টারফেস চান তবে আপনি এরকম কিছু করতে পারেন:
var object = new Map;
object.set("", "empty string");
object.set(0, "number zero");
object.set(object, "itself");
var result = new MapEntries(object).filter(primitive).map(appendBang).toMap();
alert(result.get("")); // empty string!
alert(result.get(0)); // number zero!
alert(result.get(object)); // undefined
var array = new MapEntries(object).filter(primitive).map(appendBang).toArray();
alert(JSON.stringify(array, null, 4));
function primitive(value, key) {
return isPrimitive(key);
}
function appendBang(value) {
return value + "!";
}
function isPrimitive(value) {
var type = typeof value;
return value === null ||
type !== "object" &&
type !== "function";
}
<script>
MapEntries.prototype = {
constructor: MapEntries,
map: function (functor, self) {
return new MapEntries(map(functor, this.entries, self), true);
},
filter: function (predicate, self) {
return new MapEntries(filter(predicate, this.entries, self), true);
},
toMap: function () {
return toMap(this.entries);
},
toArray: function () {
return toArray(this.entries);
}
};
function MapEntries(map, entries) {
this.entries = entries ? map : map.entries();
}
function * map(functor, entries, self) {
var that = self || null;
for (var entry of entries) {
var key = entry[0];
var value = entry[1];
yield [key, functor.call(that, value, key, entries)];
}
}
function * filter(predicate, entries, self) {
var that = self || null;
for (var entry of entries) {
var key = entry[0];
var value = entry[1];
if (predicate.call(that, value, key, entries)) yield [key, value];
}
}
function toMap(entries) {
var result = new Map;
for (var entry of entries) {
var key = entry[0];
var value = entry[1];
result.set(key, value);
}
return result;
}
function toArray(entries) {
var array = [];
for (var entry of entries) {
array.push(entry[1]);
}
return array;
}
</script>
আশা করি এইটি কাজ করবে.