Оценить строку как объект без eval () динамически? - PullRequest
3 голосов
/ 19 июля 2010

РЕДАКТИРОВАТЬ: Спасибо Кенни и всем, кто ответил так же.Это действительно было DOH ... Так глупо с моей стороны не помнить об этом.

Может быть, ответ настолько прост, что ускользает от меня ... но я знаю, что кто-то здесь можетНадеюсь, это меня научит.

Итак, у меня есть довольно большой проект, в котором рассматриваются тонны очень больших JSON, объектов, массивов и т. д. И мне нужен способ динамического доступа к этим данным без предварительного знанияиз фактических названий этих.Я знаю, что someobjectname [string] работает, но мне нужно [string] [string] [string] и т. Д. И т. Д. Другими словами, все должно быть полностью динамическим.

Я знаю, я знаю, есть производительностьпроблемы с этим подходом, и я уверен, что есть лучшие методы, но я наследую эту проблему и, поверьте мне, это не вариант, чтобы изменить ее.

СЕЙЧАС, вот супер-сверх упрощенный пример, чтобы доказатьосновная проблема.Я не могу найти способ без использования eval (), который я не могу использовать, потому что данные НЕ поступают из надежных источников.

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

<script>
// Pretend these objects are inserted into
// the DOM dynamically from where ever
// so we don't know the names till runtime
var foo = {
   value : "something"
}

var bar = {
   value : "something else"
}

window.onload = function() {

    function alertValue(option) {
                            // vvvv This is what I can't do
         var selected_object = eval(option.getAttribute("value"));
         var selected_value = selected_object.value;
         alert(selected_value);    
    }

    var option1 = document.getElementById("option1"); 
    var option2 = document.getElementById("option2");  

    option1.onclick = function () {
         alertValue(this);
    }

    option2.onclick = function () {
        alertValue(this);
    }

}

</script>

<html>
    <select>   <!-- Pretend these values are generated at runtime serverside -->
        <option id="option1" value="foo">Foo's value</option>
        <option id="option2" value="bar">Bar's value</option>
    </select>
</html>

Любая помощь будет отличной.Я надеюсь, что это простой момент "DOH".Пожалуйста, не разбирайте этот код или метод, потому что в этом нет никакого смысла.Это не так сложно, как настоящий проект.Это просто доказательство концепции, поэтому вы понимаете проблему.

Ответы [ 3 ]

3 голосов
/ 19 июля 2010

Если вы выполняете это в браузере, глобальный контекст может быть связан с window, следовательно,

var selected_object = window[option.getAttribute("value")];

(или я не понимаю, в чем ваша трудность.)

3 голосов
/ 19 июля 2010

Я не уверен, что это то, что вам нужно, но вы можете получить доступ к объектам foo и bar также через window["foo"] и window["bar"].

2 голосов
/ 19 июля 2010

foo.bar и foo["bar"] означают одно и то же в Javascript. Последний используется для свойств, имена которых неизвестны до времени выполнения или недопустимы в качестве идентификаторов. Вы можете легко связать это; foo["bar"]["baz"] означает то же самое, что и foo.bar.baz.

...