2010-03-26 1 views
0

Учитывая, у меня есть следующие: (который динамически генерируется и изменяется по длине)Динамически Формирование объекта traversion JSON без использования Eval

associations = ["employer", "address"];

Попытка пересечь объект JSON, и хочет, чтобы сформировать что-то вроде следующее:

data.employer.address 

или

data[associations[0]][association[1]]

Без этого:

eval("data."+associations.join('.'));

Наконец, я могу быть избегали за эти слова, но это нормально использовать Eval в случае, как это? Просто извлечение данных.

ответ

1

Почему бы просто не перебрать свои ассоциации?

function traverse(data, associations){ 
    for (var i=0; i<associations.length; i++){ 
     data = data[associations[i]]; 
    } 
    return data; 
} 

Ваш метод eval должен сгенерировать новую строку и проанализировать код, прежде чем он сможет начать обход.

+0

Это замечательно, спасибо. Все, что намекает на рекурсию, обычно обжаривает мой мозг. –

+0

На самом деле простая итерация будет намного быстрее (в Javascript), чем рекурсия или функциональное сокращение/сгиб. – z5h

0

Вот один из способов использования прототипа.

$A(associations).inject(data, function (obj, method) { 
    return obj[method]; 
}); 

Использование eval хорошо, если вы можете гарантировать, что пользователь не сможет повлиять на строку вы приходящую к нему. Если ваш вход поступает от пользователя или от URL-адреса, который может быть изменен пользователем, вам, вероятно, следует избегать eval.

0

Вы всегда можете создать динамический узел сценария. Например:

var yo = document.createElement("script"); 
yo.setAttribute("type", "text/javascript"); 
yo.innerHTML = "alert('yo!');"; 
document.body.appendChild(yo); 

Не требуется eval.