检查对象参数是否具有所有需要属性的最有效方法是什么?

时间:2014-11-09 12:29:07

标签: javascript

在javascript中使用object参数是我使用函数的首选方式。要检查函数是否具有所需参数,我(Solution 1)遍历所有对象参数属性并抛出错误或(Solution 2)等待,直到需要所需属性并抛出错误。解决方案二似乎很有效,但我必须在函数中的多个位置抛出。 Solution 1似乎是务实的,但应该是可重复使用的代码。还有其他我应该关注的解决方案吗?

5 个答案:

答案 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