मेरे पास कई गुणों वाली एक वस्तु है। मैं ऐसे किसी भी गुण को दूर करना चाहूंगा, जिसमें मिथ्या मूल्य हैं।
यह compactसरणियों पर प्राप्त किया जा सकता है , लेकिन वस्तुओं के बारे में क्या?
मेरे पास कई गुणों वाली एक वस्तु है। मैं ऐसे किसी भी गुण को दूर करना चाहूंगा, जिसमें मिथ्या मूल्य हैं।
यह compactसरणियों पर प्राप्त किया जा सकता है , लेकिन वस्तुओं के बारे में क्या?
जवाबों:
आप अपने स्वयं के अंडरस्कोर प्लगइन (मिक्सिन) बना सकते हैं:
_.mixin({
compactObject: function(o) {
_.each(o, function(v, k) {
if(!v) {
delete o[k];
}
});
return o;
}
});
और फिर इसे देशी अंडरस्कोर विधि के रूप में उपयोग करें:
var o = _.compactObject({
foo: 'bar',
a: 0,
b: false,
c: '',
d: null,
e: undefined
});
जैसा कि @AndreiNeculau ने बताया , यह मिश्रण मूल वस्तु को प्रभावित करता है, जबकि मूल compactअंडरस्कोर विधि सरणी की एक प्रति लौटाती है ।
इस समस्या को हल करने के लिए और हमारे compactObjectव्यवहार को अधिक पसंद करें जैसे कि यह चचेरा भाई है , यहां एक मामूली अपडेट है:
_.mixin({
compactObject : function(o) {
var clone = _.clone(o);
_.each(clone, function(v, k) {
if(!v) {
delete clone[k];
}
});
return clone;
}
});
_.compact। यह केवल सत्य मूल्यों के साथ उथले क्लोन बनाने के बजाय गुणों को हटा देगा। नीचे देखें stackoverflow.com/a/19750822/465684
deleteआमतौर पर उपयोग को हतोत्साहित किया जाता है क्योंकि यह तुरंत प्रोटोटाइप श्रृंखला से एक ही नाम के गुणों को उजागर करता है और "छिपे हुए वर्ग" (V8) के कारण प्रदर्शन को भी नुकसान पहुंचाता है - ऑब्जेक्ट संरचना को बदलने से इंजन अतिरिक्त काम करता है। सबसे अच्छा और सबसे छोटा समाधान होगा _.pick(o, _.identity)।
अंडरस्कोर संस्करण 1.7.0 के बाद से, आप उपयोग कर सकते हैं _.pick:
_.pick(sourceObj, _.identity)
_.pickमूल्यों का चयन करने के लिए दूसरा पैरामीटर एक विधेय कार्य हो सकता है। वे मूल्य जिनके लिए विधेय रिटर्न सत्यता को चुना गया है, और जिन मूल्यों के लिए विधेय रिटर्न नकली है उन्हें नजरअंदाज कर दिया गया है।
लेने _.pick (वस्तु, * कुंजी)
ऑब्जेक्ट की एक प्रति लौटाएं , केवल फ़िल्टर की गई वाइटेल्ड कुंजियों (या मान्य कुंजियों के सरणी) के लिए मान हैं । वैकल्पिक रूप से एक विधेय को इंगित करता है जो इंगित करता है कि कौन सी चाबियाँ लेनी हैं।
_.identityएक सहायक फ़ंक्शन है जो अपना पहला तर्क देता है, जिसका अर्थ है कि यह एक विधेय फ़ंक्शन के रूप में भी काम करता है जो सत्य मूल्यों का चयन करता है और झूठे लोगों को अस्वीकार करता है। अंडरस्कोर लाइब्रेरी भी अन्य विधेयकों के एक समूह के साथ आती है, उदाहरण के लिए _.pick(sourceObj, _.isBoolean)केवल बूलियन गुणों को बनाए रखेगा।
यदि आप इस तकनीक का उपयोग करते हैं, तो आप इसे थोड़ा और अधिक अभिव्यंजक बनाना चाहते हैं:
var pickNonfalsy = _.partial(_.pick, _, _.identity); // Place this in a library module or something
pickNonfalsy(sourceObj);
अंडरस्कोर संस्करण 1.6.0 भी प्रदान _.pickकिया गया है, लेकिन यह एक श्वेतसूची के बजाय एक समर्पित कार्य को स्वीकार नहीं करता है।
_.identityफ़ंक्शन का उल्लेख करने के लिए विशेष धन्यवाद , बहुत आसान है।
_.omit(sourceObj, _.isUndefined)केवल अपरिभाषित मूल्यों को हटाने के लिए उपयोग करना संभव है (झूठे, अशक्त, 0) की अनुमति देना।
pick(obj, Boolean)कि फाल्सी मूल्यों को खत्म करने के लिए किया जाए कि एक ही दृष्टिकोण का उपयोग arr.filter(Boolean)फाल्सी मूल्यों से एक सरणी को साफ करने के लिए किया जा सकता है ...
_.pick(sourceObj, prop => prop)
_.pickसंपत्ति के नाम के साथ काम करता है, इस कार्यक्षमता के लिए जैसा कि पोस्ट उपयोग में उल्लिखित है_.pickBy
_.omitBy( source, i => !i );यह एमिल के जवाब के उलटे अंदाज में बताया गया है। इस तरह imho स्पष्ट पढ़ता है; यह अधिक आत्म व्याख्यात्मक है।
यदि आपके पास ES6 की विलासिता नहीं है, तो थोड़ा कम साफ: _.omitBy( source, function(i){return !i;});
_.omitBy( source, _.isEmpty)सत्यता के _.isEmptyबजाय उपयोग करना , संग्रह से खाली सरणियों और वस्तुओं को भी आसानी से हटा देगा और शायद संख्या और तिथियों को असुविधाजनक रूप से हटा देगा । इस प्रकार परिणाम ओपी के सवाल का सटीक उत्तर नहीं है, हालांकि खाली संग्रह को हटाने के लिए यह उपयोगी हो सकता है।_.identity
omitBy। lodash.com/docs#omitBy
_.pick(source, i => i); जो नकारने से बचता है
_.pickBy(source)बस इतना ही चाहिए।
_.isEmpty(5) === true। इस प्रकार मान जो संख्याएं हैं, उन्हें गिरा दिया जाएगा।
लॉश के परिवर्तन के साथ ,
_.transform(obj, function(res, v, k) {
if (v) res[k] = v;
});
var compactObject = _.partialRight(_.pick, _.identity);
_.pickBy(object)आप सभी की जरूरत है
Object.keys(o).forEach(function(k) {
if (!o[k]) {
delete o[k];
}
});
.keysऔर .forEach।
forEachJS की विधि का लिंक दें
अचानक मुझे ज़रूरत थी कि मैं फ़र्ज़ी तरीके से फ़र्ज़ी लोगों को हटाऊं। आशा है कि ये आपकी मदद करेगा। मैं लोडश का उपयोग कर रहा हूं।
var removeFalsies = function (obj) {
return _.transform(obj, function (o, v, k) {
if (v && typeof v === 'object') {
o[k] = _.removeFalsies(v);
} else if (v) {
o[k] = v;
}
});
};
_.mixin({ 'removeFalsies': removeFalsies });
तब आप इसका उपयोग कर सकते हैं:
var o = _.removeFalsies({
foo: 'bar',
a: 0,
b: false,
c: '',
d: null,
e: undefined,
obj: {
foo: 'bar',
a: 0,
b: false,
c: '',
d: null,
e: undefined
}
});
// {
// foo: 'bar',
// obj: {
// foo: 'bar'
// }
// }
Gion_13 के उत्तर में जोड़ने के लिए:
_.mixin({
compactObject : function(o) {
var newObject = {};
_.each(o, function(v, k) {
if(v !== null && v !== undefined) {
newObject[k] = v
}
});
return newObject;
}
});
यह एक नई वस्तु बनाता है और सब कुछ क्लोन करने और कुंजी-मूल्य जोड़े को हटाने के बजाय कुंजी और मान जोड़ता है। मामूली अंतर।
लेकिन इससे भी महत्वपूर्ण बात, फाल्सी के बजाय अशक्त और अपरिभाषित के लिए स्पष्ट रूप से जांच करता है, जो मूल्य के रूप में झूठे कुंजी-मूल्य जोड़े को हटा देगा।
इस लॉश में आप इस तरह करते हैं:
_.pickBy(object, _.identity);
हालांकि _.compactसरणियों में उपयोग के लिए प्रलेखित है। यह वस्तुओं के लिए भी काम करने लगता है। मैं सिर्फ क्रोम, ओपेरा और फ़ायरफ़ॉक्स कंसोल में निम्नलिखित भाग गया:
var obj = {first: 1, second: null, third: 3, fourth: function(){return 5}}
undefined
_.compact(obj)
[1, 3, function()]
अद्यतन: जैसा कि नमूना इंगित करता है कि _.compactकिसी वस्तु पर कॉल करने से कुंजी गिर जाएगी और एक संकुचित सरणी वापस आ जाएगी।