ए 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>
उम्मीद है की वो मदद करदे।