सबसे पहले, इसका विस्तार करने के लिए बुरा व्यवहार माना जाता हैObject.prototype । इसके बजाय, पर उपयोगिता समारोह के रूप में अपनी सुविधा प्रदान करते हैं Object, वहाँ पहले से ही कर रहे हैं जैसे Object.keys, Object.assign, Object.is, ... आदि।
मैं यहां कई समाधान प्रदान करता हूं:
- का उपयोग कर
reduceऔरObject.keys
- जैसे (1), के साथ संयोजन में
Object.assign
- के
mapबजाय सिंटैक्स का उपयोग करना और फैलानाreduce
- का उपयोग कर
Object.entriesऔरObject.fromEntries
1. का उपयोग करना reduceऔरObject.keys
साथ reduceऔर Object.keysवांछित फिल्टर (ES6 का उपयोग कर लागू करने के लिए तीर वाक्य रचना ):
Object.filter = (obj, predicate) =>
Object.keys(obj)
.filter( key => predicate(obj[key]) )
.reduce( (res, key) => (res[key] = obj[key], res), {} );
// Example use:
var scores = {
John: 2, Sarah: 3, Janet: 1
};
var filtered = Object.filter(scores, score => score > 1);
console.log(filtered);
ध्यान दें कि उपरोक्त कोड में predicateएक शामिल करने की शर्त ( इस्तेमाल की गई ओपी के लिए अपवर्जन स्थिति के विपरीत) होनी चाहिए , ताकि यह Array.prototype.filterकाम करने के तरीके के अनुरूप हो ।
2. जैसा (1), के साथ संयोजन में Object.assign
उपरोक्त समाधान में उत्परिवर्तित वस्तु को वापस करने के लिए अल्पविराम ऑपरेटर का उपयोग किया जाता है । यह बेशक एक अभिव्यक्ति के बजाय दो बयानों के रूप में लिखा जा सकता है, लेकिन उत्तरार्द्ध अधिक संक्षिप्त है। अल्पविराम ऑपरेटर के बिना करने के लिए, आप इसके बजाय उपयोग कर सकते हैं , जो उत्परिवर्तित वस्तु को लौटाता है:reduceresObject.assign
Object.filter = (obj, predicate) =>
Object.keys(obj)
.filter( key => predicate(obj[key]) )
.reduce( (res, key) => Object.assign(res, { [key]: obj[key] }), {} );
// Example use:
var scores = {
John: 2, Sarah: 3, Janet: 1
};
var filtered = Object.filter(scores, score => score > 1);
console.log(filtered);
3. mapइसके बजाय सिंटैक्स का उपयोग करना और फैलानाreduce
यहां हम Object.assignकॉल को लूप से बाहर ले जाते हैं , इसलिए इसे केवल एक बार बनाया जाता है, और इसे अलग-अलग तर्कों के रूप में अलग-अलग कुंजी ( प्रसार सिंटैक्स का उपयोग करके ) पास करें:
Object.filter = (obj, predicate) =>
Object.assign(...Object.keys(obj)
.filter( key => predicate(obj[key]) )
.map( key => ({ [key]: obj[key] }) ) );
// Example use:
var scores = {
John: 2, Sarah: 3, Janet: 1
};
var filtered = Object.filter(scores, score => score > 1);
console.log(filtered);
4. का उपयोग करना Object.entriesऔरObject.fromEntries
के रूप में समाधान वस्तु को एक मध्यवर्ती सरणी में अनुवाद करता है और फिर उस सादे वस्तु में परिवर्तित करता है, यह Object.entries(ES2017) और विपरीत का उपयोग करने के लिए उपयोगी होगा (यानी कुंजी / मूल्य जोड़े के एक सरणी से एक वस्तु बनाएं ) Object.fromEntries( ES2019)।
यह इस "एक-लाइनर" पद्धति की ओर जाता है Object:
Object.filter = (obj, predicate) =>
Object.fromEntries(Object.entries(obj).filter(predicate));
// Example use:
var scores = {
John: 2, Sarah: 3, Janet: 1
};
var filtered = Object.filter(scores, ([name, score]) => score > 1);
console.log(filtered);
विधेय फ़ंक्शन को यहाँ तर्क के रूप में एक कुंजी / मान युग्म मिलता है, जो थोड़ा अलग होता है, लेकिन विधेय फ़ंक्शन के तर्क में अधिक संभावनाओं के लिए अनुमति देता है।