Динамическое формирование обхода объекта JSON без использования eval - PullRequest
0 голосов
/ 26 марта 2010

Учитывая, что у меня есть следующее: (которое генерируется динамически и различается по длине)

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

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

data.employer.address

или

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

Без этого:

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

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

Ответы [ 3 ]

1 голос
/ 26 марта 2010

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

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

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

0 голосов
/ 26 марта 2010

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

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

Оценка не требуется.

0 голосов
/ 26 марта 2010

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

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

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

...