2014-12-16 3 views
9

Lets sagen, ich habe Javascript Objekte wie dieses:Überprüfen Sie, ob ein JavaScript-Objekt einen Eigenschaftsnamen hat, die mit einer bestimmten Zeichenfolge beginnt

addr:housenumber: "7" 
addr:street: "Frauenplan" 
owner: "Knaut, Kaufmann" 

Wie kann ich überprüfen, ob das Objekt eine Eigenschaft Name mit addr beginnt ? Ich würde etwas entlang der Linien der folgenden sollte möglich sein, sich vorstellen:

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

Ich versuchte RegExp und .match() ohne Erfolg.

Antwort

19

Sie es gegen das Array.some, die ein bool kehrt mit den Tasten des Objekts überprüfen können.

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

Sie auch Array.filter nutzen könnten und überprüfen Sie es Länge ist. Aber Array.some ist hier passender.

+0

Beifall für alle! Dieser scheint der kürzeste und eleganteste Weg zu sein. –

+6

können Sie **> -1 ** loswerden, indem Sie "~" vor ** k.indexOf ....... ** –

+0

@Edwin thanks. Wusste es nicht :) –

0

Try this:

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

Sie können die Object.keys-Funktion verwenden, um ein Array von Schlüsseln zu erhalten, und dann die filter-Methode verwenden, um nur Schlüssel auszuwählen, die mit "addr" beginnen.

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"]; 

Dies gibt Ihnen Existenz (propertyNames.length > 0) und die spezifischen Namen der Tasten, aber wenn man nur auf die Existenz testen möchten, können Sie einfach filter mit some ersetzen.

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

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

Ich glaube nicht, "Abfrage" eine Objekteigenschaften ist möglich. Sie müssten die Eigenschaften einzeln durchlaufen und feststellen, ob sie übereinstimmen. so etwas wie dieses ...

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')); 

Anschließend können Sie die Eigenschaft bearbeiten, wenn es findProp true zurück ...

0

Sie

eine Funktion schreiben können
function check(model) { 
    var keys = []; 
    for (key in model) { 
     if(key.indexOf("addr") > -1) 
      keys.push(key); 
    } 
    return keys; 
} 
Verwandte Themen