सबसे पहले, इसका विस्तार करने के लिए बुरा व्यवहार माना जाता है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
उपरोक्त समाधान में उत्परिवर्तित वस्तु को वापस करने के लिए अल्पविराम ऑपरेटर का उपयोग किया जाता है । यह बेशक एक अभिव्यक्ति के बजाय दो बयानों के रूप में लिखा जा सकता है, लेकिन उत्तरार्द्ध अधिक संक्षिप्त है। अल्पविराम ऑपरेटर के बिना करने के लिए, आप इसके बजाय उपयोग कर सकते हैं , जो उत्परिवर्तित वस्तु को लौटाता है:reduce
res
Object.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);
विधेय फ़ंक्शन को यहाँ तर्क के रूप में एक कुंजी / मान युग्म मिलता है, जो थोड़ा अलग होता है, लेकिन विधेय फ़ंक्शन के तर्क में अधिक संभावनाओं के लिए अनुमति देता है।