如何检查JavaScript对象是否具有以特定字符串开头的属性名称?

33

假设我有像这样的 JavaScript 对象:

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

我该如何检查对象是否具有以 addr 开头的属性名称?我想象下列代码应该是可行的:

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

我尝试使用 RegExp.match(),但都无济于事。

8个回答

49

你可以使用Array.some来检查它是否是对象的键,它会返回一个bool值。

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

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


大家好!这似乎是最简短和最优雅的方法。 - Alexander Rutz
@Edwin 太棒了,更加优雅! - Alexander Rutz
4
@Edwin 嗯... Object.keys(obj.some((k) => ~k.indexOf("addr"));。等待它到来 :) (翻译:期待 Object.keys(obj.some((k) => ~k.indexOf("addr")); 的到来) - Amit Joki
这里的 ~ 的作用是什么? - zookastos
3
请注意,对于非常大的对象,使用Object.keys()在调用some()之前生成的效率不高;更有效率的方法是逐个属性使用for in进行检查。 - Skywalker13
显示剩余2条评论

12
你可以使用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"];

如果你只需要测试存在性,你可以用some替换filter,这样就可以得到存在性(propertyNames.length > 0)和键的具体名称。


6
Obj = {address: 'ok', x:5}

Object.keys(obj).some(function(prop){
  return ~prop.indexOf('add')
}) //true

2
这里的波浪号功能是什么? - Sweet Chilly Philly

1
您可以使用startsWith()进行检查:
Object.keys(obj).some(i => { return i.startsWith('addr') })

0

试试这个:

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;
    }
}

0

我认为无法“查询”对象属性。您必须逐个循环遍历属性并确定它们是否匹配。就像这样...

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,那么您可以处理该属性...


0
你可以编写一个函数。
function check(model) {
   var keys = [];
   for (key in model) { 
       if(key.indexOf("addr") > -1) 
           keys.push(key); 
   }
   return keys;
}

-1
为什么不只是

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


1
因为它涉及到键而不是值。 - Erwin Lengkeek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接