2016-07-15 8 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

Если вы хотите просто проверить, если свойство существует или нет, вы можете stringify объект, а затем проверить, если значение существует в строке или нет.

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

после должного рассмотрения, я применил строжайшие данные и поиск. Свойство глубокого поиска объекта возвращает объект, у которого есть свойство i.e. Я не могу изменить свойство объекта, который я искал. Спасибо за вашу помощь :) –

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 Просто небольшой указатель, вместо этого 'return false' как значение по умолчанию, ничего не возвращать или' return 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'); 
Смежные вопросы