在javascript中使用object参数是我使用函数的首选方式。要检查函数是否具有所需参数,我(Solution 1
)遍历所有对象参数属性并抛出错误或(Solution 2
)等待,直到需要所需属性并抛出错误。解决方案二似乎很有效,但我必须在函数中的多个位置抛出。 Solution 1
似乎是务实的,但应该是可重复使用的代码。还有其他我应该关注的解决方案吗?
答案 0 :(得分:1)
你实际上可以这样做
var propsNeeded = ["prop1", "prop2", "blah", "blah", "blah"],
obj = {
prop1: "Hi"
}
function hasRequiredProperties(props, obj){
return Object.keys(obj).sort().join() == propsNeeded.sort().join();
}
console.log(hasRequiredProperties(propsNeeded, obj)); // false
您可以检查单个属性,例如
function hasProperty(propName, obj){
return obj.hasOwnProperty(propName);
}
答案 1 :(得分:1)
为了保持一致性,我会创建require
方法,并在需要某些属性时始终使用它。
var require = function (key, object) {
if (typeof object[key] === 'undefined') {
throw new Error('Required property ' + key + ' is undefined');
}
};
一旦我确定需要财产,我会测试是否存在必需的财产。像这样:
var example = function (args) {
require('alwaysRequired', args);
// some code here which uses property alwaysRequired
if (args.something) {
require('sometimesRequired', args);
// some code here which uses property sometimesRequired
}
};
答案 2 :(得分:0)
使用@Amit的答案我可能会向Object
本身添加一个方法:
Object.prototype.hasAllProperties = function(props, fire){
var result = Object.keys(this).sort().join() == propsNeeded.sort().join();
if (fire && !result){
throw new Error('Object does not define all properties');
}
return result;
}
并在您的函数中:
function someFunction(myObject){
var objComplete = myObject.hasAllProperties(["prop1", "prop2", "prop3"], false);
}
<强>更新强>
在注意到@ Amit原始答案的问题之后,这就是我的建议:
Object.prototype.hasAllProperties = function(props, fire){
var result = true;
$(props).each(function(i, e){
if (!this.hasOwnProperty(e) ) {
result = false;
return false;
}
});
if (fire && !result){
throw new Error('Object does not define all properties');
}
return result;
}
答案 3 :(得分:0)
这只是检查对象上是否存在键的一般情况,这可以通过
轻松完成requiredParams.every(function(prop) { return prop in paramObj; })
它几乎像自然语言。 &#34;获取所需的参数,它们中的每一个都是参数对象吗?&#34;。
将其包装在function checkParams(paramObj, requiredParams)
中以便于重复使用。
更一般地说,这是询问一个列表(在这种情况下是所需参数列表)是否包含在另一个列表中(params对象上的键)的问题。因此,我们可以编写列表包含的一般例程:
function listIncluded(list1, list2) {
return list1.every(function(e) { return list2.indexOf(e) !== -1; });
}
然后我们的参数检查变为
function checkParams(paramObj, requiredParams) {
return listIncluded(requiredParams, Object.keys(paramObj));
}
答案 4 :(得分:0)
如果您想知道对象是否至少具有某些属性,则可以使用此函数而不使用第三个参数:
function hasRequiredProperties(propsNeeded, obj, strict) {
if (strict) return Object.keys(obj).sort().join() == propsNeeded.sort().join();
for (var i in propsNeeded ) {
if (!obj.hasOwnProperty(propsNeeded[i])) return false;
}
return true;
};
示例:
options = {url: {
protocol: 'https:',
hostname: 'encrypted.google.com',
port: '80'
}
};
propsNeeded = ['protocol', 'hostname'];
hasRequiredProperties(propsNeeded, options.url); // true
hasRequiredProperties(propsNeeded, options.url, true); // false