2015-03-12 10 views
22

क्या कोई विधि या विधियों की एक श्रृंखला है यह जांचने के लिए कि क्या निम्न का उपयोग करने के बजाय लॉनाश में उपलब्ध किसी ऑब्जेक्ट में कुंजी की सरणी मौजूद है या नहीं?एकाधिक कुंजी के लिए LoDash _.has

var params = {...} 
var isCompleteForm = true; 
var requiredKeys = ['firstname', 'lastname', 'email'] 

for (var i in requiredKeys) { 
    if (_.has(params, requiredKeys[i]) == false) { 
     isCompleteForm = false; 
     break; 
    } 
} 

if (isCompleteForm) { 
    // do something fun 
} 

अद्यतन

धन्यवाद भयानक समाधान के लिए हर किसी को! यदि आप रुचि रखते हैं, तो यहां विभिन्न समाधानों के जेएसपीआरएफ हैं।

http://jsperf.com/check-array-of-keys-for-object

उत्तर

22

आप पूरी तरह कार्यात्मक जा सकते हैं, every, has और partial कार्यों के साथ, इस

var requiredKeys = ['firstname', 'lastname', 'email'], 
    params = { 
     "firstname": "thefourtheye", 
     "lastname": "thefourtheye", 
     "email": "NONE" 
    }; 
console.log(_.every(requiredKeys, _.partial(_.has, params))); 
// true 

हम _.every के लिए एक आंशिक समारोह वस्तु है, जो वास्तव में _.has आंशिक रूप से params वस्तु के लिए आवेदन किया है पारित की तरह। _.everyrequiredKeys सरणी को फिर से चालू करेगा और आंशिक ऑब्जेक्ट पर वर्तमान मान को पास करेगा, जो आंशिक _.has फ़ंक्शन पर वर्तमान मान लागू करेगा और true या false वापस करेगा। _.everytrue वापस लौटाएगा यदि सरणी में सभी तत्व फ़ंक्शन ऑब्जेक्ट को पास करते समय true लौटाते हैं। उदाहरण में मैंने ऊपर दिखाया है, क्योंकि सभी चाबियाँ params में हैं, यह true लौटाती है। यहां तक ​​कि यदि उसमें एक तत्व मौजूद नहीं है, तो यह false वापस आ जाएगा।

+3

यह उल्लेखनीय है कि यह आदर्श होगा एक [mixin] के लिए उम्मीदवार (https://lodash.com/docs#mixin) अगर यह एक ऐप में नियमित रूप से पुन: उपयोग किया जा रहा था। यह पठनीयता में भी सुधार करेगा। [बेला] (https://jsfiddle.net/nwayve/9m9bcrtc/) – nwayve

3
_(requiredKeys).difference(_(params).keys().value()).empty() 

मेरा मानना ​​है कि। कुंजी कदम सब कुछ सरणी में हो रहा है तो सेट के साथ काम कर रहा है।

या

_requiredKeys.map(_.pluck(params).bind(_)).compact().empty() 

काम सकता है।

+0

'' 'लेखन त्रुटि : _.pluck (...)। बाइंड एक फंक्शन नहीं है। दूसरे समाधान – YarGnawh

+0

के लिए ''' मेरा मानना ​​है कि _.pluck को अब लॉकैश में _.map कहा जाता है 4.15.0 – Backer

1

यह मानते हुए कि परम अधिक प्रॉपर्टी हो सकती से की आवश्यकता है ...

var keys = _.keys(params); 
var isCompleteForm = requiredKeys.every(function (key) { 
    return keys.indexOf(key) != -1; 
}); 

चाल करना चाहिए।

25

मैं जानता हूँ कि प्रश्न lodash के बारे में है, लेकिन इस वेनिला जे एस के साथ किया जा सकता है, और यह बहुत तेजी से है:

requiredKeys.every(function(k) { return k in params; }) 

और यहां तक ​​कि क्लीनर ES2015 में:

requiredKeys.every(k => k in params) 
संबंधित मुद्दे