【问题标题】:How to check if a JavaScript Object has a property name that starts with a specific string?如何检查 JavaScript 对象是否具有以特定字符串开头的属性名称?
【发布时间】:2015-02-14 21:51:09
【问题描述】:

假设我有这样的 javascript 对象:

var obj = {
    'addr:housenumber': '7',
    'addr:street': 'Frauenplan',
    'owner': 'Knaut, Kaufmann'
}

如何检查对象是否具有以addr 开头的属性名称?我想像下面这样的事情应该是可能的:

if (e.data[addr*].length) {

我试过RegExp.match() 无济于事。

【问题讨论】:

    标签: javascript object properties identifier


    【解决方案1】:

    您可以使用返回boolArray.some 与对象的键进行检查。

    if(Object.keys(obj).some(function(k){ return ~k.indexOf("addr") })){
       // it has addr property
    }
    

    您也可以使用Array.filter 并检查它的长度。但Array.some 更适合这里。

    【讨论】:

    • 大家干杯!这似乎是最短、最优雅的方法。
    • @Edwin 精彩,更优雅!
    • 大声笑,很快,在 ES6 中使用胖箭头函数会更容易
    • @Edwin 是的.. Object.keys(obj.some((k) => ~k.indexOf("addr"));.等待它的到来:)
    • 注意,对于一个非常大的对象,效率不是很高,因为Object.keys()是在调用some()之前生成的;使用for in 逐个检查属性会更有效。
    【解决方案2】:

    您可以使用Object.keys 函数获取键数组,然后使用filter 方法仅选择以"addr" 开头的键。

    var propertyNames = Object.keys({
        "addr:housenumber": "7",
        "addr:street": "Frauenplan",
        "owner": "Knaut, Kaufmann"
    }).filter(function (propertyName) {
        return propertyName.indexOf("addr") === 0;
    });
    // ==> ["addr:housenumber", "addr:street"];
    

    这将为您提供存在 (propertyNames.length > 0) 和键的特定名称,但如果您只需要测试存在,您可以将 filter 替换为 some

    【讨论】:

      【解决方案3】:
      Obj = {address: 'ok', x:5}
      
      Object.keys(obj).some(function(prop){
        return ~prop.indexOf('add')
      }) //true
      

      【讨论】:

      • 这里的 Tilders 功能是什么?
      【解决方案4】:

      你也可以用startsWith()检查这个:

      Object.keys(obj).some(i => { return i.startsWith('addr') })
      

      【讨论】:

        【解决方案5】:

        试试这个:

        var myObject = {
            'prop1': 'value1',
            'xxxxx': 'value2'
        };
        
        var stringToCheck = 'addr';
        
        for(var propertyName in myObject) {
            var x = propertyName.substr(0, stringToCheck.length - 1);
        
            if(x == stringToCheck) {
                return true;
            }
        }
        

        【讨论】:

          【解决方案6】:

          我认为“查询”对象属性是不可能的。您必须逐个遍历属性并确定它们是否匹配。像这样...

          function findProp(e, prop)
          {
              for(var o in e.data){
                  if(o.substr(0, prop.length)==prop) //<- you could try the regex or match operation here
                      return true;
              }
              return false;
          }
          
          alert(findProp({data:{addr:{street:"a", sub:"b"}}}, 'addr'));
          

          如果 findProp 返回 true,您就可以处理该属性...

          【讨论】:

            【解决方案7】:

            你可以写一个函数

            function check(model) {
               var keys = [];
               for (key in model) { 
                   if(key.indexOf("addr") > -1) 
                       keys.push(key); 
               }
               return keys;
            }
            

            【讨论】:

              【解决方案8】:

              为什么不直接

              var foo = {'bar':'funtimes'};
              if (foo.bar.includes('fun')) {
                console.log('match');
              }

              【讨论】:

              • 因为它是关于键,而不是值。
              猜你喜欢
              • 2012-04-16
              • 2019-08-04
              • 2010-09-13
              • 2021-03-12
              • 2015-08-15
              • 1970-01-01
              • 2014-12-10
              • 1970-01-01
              相关资源
              最近更新 更多