2014-12-17 5 views
1

Я не могу найти, как это сделать ... ? (Поиск переменной в блоке var [javascript]!)? Я хотел бы быть в состоянии найти позволяет сказать, Николас Филлипс из этого ...Поиск значения в переменной ... Javascript

var profiles = { 
    Nicholas_Phillips: { 
     Name: "Nicholas_Phillips" 
    } 
} 

и получить взамен переменной части «profiles.Nicholas_Phillips» или родительский держатель я думаю ?!

+1

Рекурсивно искать ваш объект. – Sirko

+0

@Sirko Не могли бы вы привести мне пример? Я новичок в JavaScript ... – Nick

+0

Взгляните на http://stackoverflow.com/questions/1946165/json-find-in-javascript и http://stackoverflow.com/questions/19253753/javascript -find-json-value –

ответ

-1

Вот быстрая функция, которая берет объект, который вы хотите искать, дочерний объект, который мы хотим найти, и значение, которое мы хотим от этого ребенка. Затем он просмотрит все ключи в объекте и посмотрит, соответствуют ли они вашему значению. Если это так, он также гарантирует, что этот конкретный объект (а не его прототип) имеет ключ. Затем он проверяет, имеет ли дочерний объект требуемое значение и возвращает это значение.

function findKey(obj, child, value){ 
     for (key in obj) { 
     if (key === child && obj.hasOwnProperty(child)){ 
      if(obj[child][value]){ 
        return obj[child][value] 
        } 
      } 
     } 
    } 

Так что, если мы запустили это в контексте Вашего вопроса:

findKey(profiles, "Nicholas_Phillips", "Name"); 

Было бы вернуть

"Nicholas_Phillips" 

В противном случае он возвращает неопределенное

+0

Это не находит то, что ищет OP в объекте OP. –

+0

OP сказал, что хочет «profles.Nicholas_Phillips», что это такое. – Aweary

+0

Нет, снова прочитайте вопрос и, в частности, заголовок. OP ищет это ** значение **, а не тот ключ (вопрос может быть намного яснее). –

0

Вы просто должны искать ваш объект рекурсивно:

function search(obj, needle, path) { 

    // get all keys from current object 
    var keys = Object.keys(obj); 

    // walk all properties 
    for(var i=0; i<keys.length; i++) { 

    // check for a match 
    if(obj[ keys[i] ] === needle) { 
     return path + '.' + keys[i]; 
    } 

    // if it is a subject, search it recursively 
    if(typeof obj[ keys[i] ] == 'object') { 
     var recCall = search(obj[ keys[i] ], needle, path + '.' + keys[i]); 

     // if we had a match, return it 
     if(recCall !== null) { 
     return recCall; 
     } 
    } 
    } 

    // if we came this far, no match was found 
    return null; 
} 

// execute 
var path = search(profiles, "Nicholas_Phillips", 'profiles'); 

Я не уверен, что именно вы хотите искать (значение или ключ?) И что возвращать (путь или ссылка на родителя?), Но приведенный выше код должен работать для всех с некоторыми незначительными изменениями ,

+0

Его довольно близко, но не достаточно близко ... Я ищу способ найти этот профиль.Nicholas_Phillips.Name = «Nicholas Phillips» - И он выведет профили. Николас_Филлипс, ища имя = «Николай Филлипс»! – Nick

+0

@Nick: Затем настройте его, чтобы делать то, что вы хотите. Здесь более чем достаточно, чтобы вы собрались.Если вы хотите найти свойства «Имя» и оставить часть «Имя» вне пути, вы можете это сделать. –

0

Вам нужно рекурсивный поиск, что-то смутно, как:

var profiles = { 
 
    Nicholas_Phillips: { 
 
    Name: "Nicholas_Phillips" 
 
    } 
 
}; 
 
function find(obj, value, path) { 
 
    if (Object.keys(obj).some(function(key) { 
 
     var thisValue = obj[key]; 
 
     var p; 
 
     if (thisValue === value) { 
 
     // Found it, set the path and return true to stop looping (true = stops `some`) 
 
     path = path ? path + "." + key : key; 
 
     return true; 
 
     } 
 
     if (typeof thisValue === "object") { 
 
     // Found an object, recurse into it 
 
     p = find(thisValue, value, path ? path + "." + key : key); 
 
     if (p) { 
 
      // We found it (somewhere) in that object, set the path and stop looping 
 
      path = p; 
 
      return true; 
 
     } 
 
     } 
 
    })) { 
 
    // We found it, return path 
 
    return path; 
 
    } 
 
    // Not found, return undefined 
 
    return undefined; 
 
} 
 
snippet.log(find(profiles, "Nicholas_Phillips")); // "Nicholas_Phillips.Name" 
 
snippet.log(find(profiles, "foo")); // undefined
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> 
 
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

что реализация find возвращает путь к свойству он найден. Это не экстенсивно протестирован, но он должен указать вам правильный путь.

Смежные вопросы