我怎样才能更优雅地做几个_.has检查?

时间:2015-06-08 13:48:58

标签: javascript underscore.js

我有一个像这样的对象

myObject:{"property1": "valueX",
          "property2": "valueY",
          "property3": "valueZ",
          "property4": "valueV",
          "property5": "valueW"}

我希望确保我的所有对象属性名称都不匹配多个字符串。

我找到的最直观的方法就是这个:

if( !_.has(myObject, "TestingValue1")&&
    !_.has(myObject, "TestingValue2")&&
    !_.has(myObject, "TestingValue3")&&
    !_.has(myObject, "TestingValue4")){
//do something
}

但如果我有太多的属性名称需要检查,它就会变成相当大的代码。

我正在努力想出一个更优雅的解决方案。我觉得它几乎可以,但我似乎没有工作(它总是返回true)。这是:

var TestingValues = ["TestingValue1", "TestingValue2", "TestingValue3"]

if (!_.every(TestingValues, _.partial(_.has, myObject))){
//do something
}
你能告诉我有什么问题吗?我该如何申报TestingValues

编辑

@Sergiu Paraschiv我在myObject和测试数组中使用了不同的值,只是为了让它更容易阅读。当然我用相同的值测试它。

你是对的,我才意识到它有效。起初我没有,因为它没有按预期工作。我把事情搞混了:如果字符串数组中的任何项与{{1}的任何属性相匹配,我想返回 false }

3 个答案:

答案 0 :(得分:3)

你可以这样做:

var TestingValues = [ "TestingValue1", "TestingValue2", "TestingValue3" ];

if(!_.isEmpty(_(myObject).pick(TestingValues)){...

或者你自己建议:

if (!_.some(TestingValues, _.partial(_.has, myObject)))

答案 1 :(得分:0)

替代:

function gatherData()
{
    var name = window.prompt('Please enter the name of the participant:');
    name = name.replace(/\s+/g, '');
    if ((/[^A-Z\s\-\']/gi.test(name)) || (name == '') || (name == 'undefined'))
    {
        alert ('You must enter a valid name! ');
        return;
    }

    var points = window.prompt('Please enter the achieved points of the participant:');
    points = parseInt(points, 10);
    if ((/[^0-9\s\-\']/gi.test(points)) || (points == ''))
    {
        alert ('You must enter a valid number! ');
        return;
    }

    participant.push({name: name, points: points});

    createChart();
};

答案 2 :(得分:0)

你可以尝试

 var testingValues = ["TestingValue1", "TestingValue2", "TestingValue3"];

 var myObj = {
    "property1": "valueX",
    "property2": "valueY",
    "property3": "valueZ",
    "property4": "valueV",
    "property5": "valuez"
};

var result = _.every(myObj, function(value, key, obj){
    return !_.contains(testingValues, value);
});
console.log(result);