2016-07-15 110 views
1

我有一个对象。我想检查一下是否存在特定的属性。查找对象内的特定属性

问题是:我正在查找的属性可能在任何地方,即:对象的结构是不确定的。

例如:

obj1 = { "propIWant": "xyz" } 
obj2 = { "prop1": [ {"key": "value"}, {"key":"value"}, 1, {"key": { "propIWant": "xyz"}}] 

我试过以下,但似乎失败:

var lastTry = function(entry){ 
    // if entry is an array 
    if(typeof entry === 'object' && entry instanceof Array){ 
    for(var i in entry) 
     entry[i] = this.lastTry(entry[i]); 
    } 
    // if entry is a normal object 
    else if(typeof entry === 'object'){ 
    // iterate through the properties of the entry 
    for(var key in entry){ 
     console.log('key is: ', entry[key]) 
     // in case the entry itself is an array 
     if(typeof entry[key] === 'object' && entry[key] instanceof Array){ 
     for(var i in entry[key]){ 
      entry[key][i] = this.lastTry(entry[key][i]); 
     } 
     } 
     // in case the entry is a simple object 
     else if(typeof entry[key] === 'object') { 
     console.log('entry[key] is an object', entry[key], key) 
     // if we directely find the property.. modify it 
     if(entry[key].hasOwnProperty('_internal_url')){ 
      **entry[key]['_internal_url'] = "http://localhost:4000"+entry[key]['_internal_url'];** <-- My objective 
     } 
     else{ 
      // call this method again on that part 
      // for(var i in entry[key]){ 
      // if(typeof entry[key][i] === 'object') 
      //  entry[key][i] = this.lastTry(entry[key][i]); 
      // } 
     } 
     }else{ 
     console.log('not found') 
     } 
    } 
    } 
} 

是否有人可以帮助我走出它,我发现:Find by key deep in a nested object但,而不是返回找到的部分,我想编辑该属性并返回具有修改后的属性的整个对象,而不仅仅是具有该属性的对象的子集。

+0

@DominicTobias寻找到它 –

+0

的[在嵌套的JSON对象键深查找]可能的复制(http://stackoverflow.com/questions/15523514/find-by-key-deep-in-nested- json-object) – morels

回答

0

你试过:

obj1.hasOwnProperty('propIWant') 
0

如果你希望只检查是否存在财产或没有,你可以将字符串化对象,然后检查是否值存在字符串或没有。

var obj2 = { 
 
    "prop1": [{ 
 
     "key": "value" 
 
    }, { 
 
     "key": "value" 
 
    }, 
 
    1, { 
 
     "key": { 
 
     "propIWant": "xyz" 
 
     } 
 
    } 
 
    ] 
 
} 
 

 
var key = 'propIWant'; 
 
var key2 = 'propIWant1'; 
 

 
function isPropInObject(obj, prop) { 
 
    var r = new RegExp(prop + "\":") 
 
    var match = JSON.stringify(obj).match(r); 
 
    return match && match.length > 0 ? true : false 
 
} 
 

 
console.log(isPropInObject(obj2, key)) 
 
console.log(isPropInObject(obj2, key2))

+0

上面可能会产生一个问题:万一对象是HTML元素输出集合的值(假设文本字段的内容与我正在查找的内容相匹配,因此我最终可能会操纵它以及)。不错的想法,但在这种情况下,它可能无法按预期工作 –

+0

然后,我想你应该更新你的问题。 – Rajesh

+0

经过适当考虑,我申请了数据串化和搜索。对象属性深搜索返回具有该属性的对象,即,我无法更改我正在查找的对象的属性。感谢您的帮助:) –

0

好了,检查的道具是对象本身,并使用递归函数来找到你正在寻找的“深”的财产?

function findProp(obj, lookFor) { 
    for (var prop in obj) { 
    if (prop == lookFor) return obj[prop] 
    if (typeof obj[prop] == 'object') { 
     var checkNested = findProp(obj[prop], lookFor)  
     if (checkNested) return checkNested 
    } 
    } 
    return false 
} 

它与console.log(findProp(obj2, 'propIWant'))

演示 - >http://jsfiddle.net/zqcurg70/

+0

谢谢!是否有可能操纵该属性并返回整个对象?它不断返回搜索值。我的想法是改变它的财产。再次感谢:) –

+0

@RamanathanIyer,如果我明白你的意思,那么你可以返回一个对象像这样更新的小提琴 - > ** http://jsfiddle.net/2cab85L3/** – davidkonrad

+1

@davidkonrad只是一个小指针,而是返回false作为默认值,不返回任何东西或返回undefined。 'false'可以是一个有效的值。 – Rajesh

0

数组和对象数据可以是一种常见的方式访问:

obj[key] and arr[pos];

这种方式可以简化您的代码。请注意,key可以是一个字符串,如果是数组,则可以是一个字符串。

以下版本仅在深度优先的逻辑中搜索元素和最终的子元素(包括数组和对象)。

var found = 0; 
var findProp = function(entry) { 

    if(typeof entry === 'object') 

    for(var key in entry) { 

     findProp(entry[key]); 

     if(entry[key].hasOwnProperty('_internal_url')) { 
     found++; 
     entry[key]['_internal_url'] = "http://localhost:4000" + entry[key]['_internal_url']; 
     } 
    } 
} 

console.log('found ' + found + 'occurrences'); 
相关问题