2015-09-14 4 views
0

У меня есть сложный объект с вложенными значениями. Значениями могут быть строки, массивы, массивы объектов или объекты null. Что-то вроде этого:Поиск значения внутри сложного объекта

{ 
foo:'a', 
bar:'b', 
otherthings : [{yep:'0',yuk:'yoyo0'},{yep:'1',yuk:'yoyo1'}], 
foobar : 'yup', 
value: null 
} 

Какой самый быстрый способ проверить, если значение (например, yoyo1) существует где-то в объекте? Есть ли встроенная функция Javascript?

+0

возможно дубликат [Javascript найти значение JSon] (http://stackoverflow.com/questions/19253753/javascript -find-json-value) –

+2

_ Есть ли встроенная функция Javascript? _ Нет, вы должны реализовать ее самостоятельно. Рекурсия - ваш друг. – hindmost

+1

nope, javascript не имеет встроенной функции, но вы можете использовать простой 'for ... in' loop и проверить все вручную – Grundy

ответ

2

Некоторые короткие итерации:

var data = { 
 
    foo: 'a', 
 
    bar: 'b', 
 
    otherthings: [{ yep: '0', yuk: 'yoyo0' }, { yep: '1', yuk: 'yoyo1' }], 
 
    foobar: 'yup', 
 
    value: null 
 
}; 
 

 
function findInObject(o, f) { 
 
    return Object.keys(o).some(function (a) { 
 
     if (Array.isArray(o[a]) || typeof o[a] === 'object' && o[a] !== null) { 
 
      return findInObject(o[a], f); 
 
     } 
 
     return o[a] === f; 
 
    }); 
 
} 
 

 
document.write(findInObject(data, 'yoyo1') + '<br>'); 
 
document.write(findInObject(data, 'yoyo2') + '<br>'); 
 
document.write(findInObject(data, null) + '<br>');

+0

Wie machst Du das bloß immer? :-) +1 – DavidDomain

1

Regex Решение

var myObject = { 
    foo: 'a', 
    bar: 'b', 
    otherthings: [{ 
     yep: '0', 
     yuk: 'yoyo0' 
    }, { 
     yep: '1', 
     yuk: 'yoyo1' 
    }], 
    foobar: 'yup', 
    value: null 
}; 

var myStringObject = JSON.stringify(myObject); 
var matches = myStringObject.match('yep'); //replace yep with your search query 

+0

Это также будет соответствовать, если json имеет атрибут yep, не обязательно значение «yep». – RainingChain

+0

и я полностью согласен с вами, поэтому запрос должен быть правильным – Johan

+0

Хорошо звучит хорошо. Таким образом, я также могу найти подстроку, такую ​​как '' y'' или '' yo''. Единственная проблема, которую я вижу, - это когда я ищу подстроку, такую ​​как '' nu'', ''ul'' или'' null'', потому что я включаю также совпадение «null» из строкового объекта – floatingpurr

1
var jsonStr = JSON.stringify(myJSON); 
return jsonStr.indexOf(':"yolo1"') !== -1; 

Это работает только если вы хотите знать, если он существует (не там, где она есть). Он также может быть не самым результативным.

1

Другое решение:

function findInObject(obj, comparedObj){ 
    return Object.keys(obj).some(function(key){ 
     var value = obj[key]; 

     if (!value) { 
      return false; 
     } 

     if (typeof value === "string") { 
      return value === comparedObj; 
     } 

     if (value instanceof Array) { 
      return value.some(function(e){ 
       return (typeof value === "string" && e === comparedObj) || 
         findInObject(e, comparedObj); 
      }); 
     } 

     return findInObject(value, comparedObj); 
    }); 
} 
Смежные вопросы