Как получить ключ объекта массива? - PullRequest
1 голос
/ 21 апреля 2011

Учитывая JSON-ответ на форму, мне нужно проанализировать элементы JSON, чтобы найти сообщения об ошибках со связанным с ними элементом, к которому привязана ошибка.

Данные возвращаются в формате JSON с сообщениями об ошибках в виде последней пары переменных, выглядящей следующим образом:

"invalid":[{"field1":"Field 1 is required"}]

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

Я использую dojo в этом проекте, и я совсем не знаком с ним, поэтому я пытался использовать функции dojo, когда это возможно, если есть что-то, что может с этим справиться.В настоящее время я нахожусь там:

var retObj = dojo.fromJson(ioargs.xhr.responseText);

dojo.forEach(retObj.invalid, function(entry,i){ 
    console.debug(entry);
});

Вывод на консоль:

Object { field1="Field 1 is required"}

Моя цель - вытащить значение "field1", чтобы я знал, в каком поле ввода эта ошибканазначенный, затем назначить значение field1 этому полю ошибки.

Спасибо!

Ответы [ 2 ]

1 голос
/ 21 апреля 2011

Не знаю ничего о Dojo, но вы ищете довольно простой for in цикл.

var retObj = dojo.fromJson(ioargs.xhr.responseText),
    invalids = retObj.invalid[0],
    res = {}; //here will be your final key=>value

for (var key in invalids) {
    res[key] = invalids[key];
}

http://jsfiddle.net/DgXkq/

Вас также может заинтересовать https://stackoverflow.com/search?q=%5Bjavascript%5Dparsing+json

0 голосов
/ 21 апреля 2011

Невозможно найти ключ объекта, если у вас нет доступа к родительскому объекту.Я считаю, что лучшим решением в этом случае будет массаж JSON для передачи более значимой информации в валидатор, то есть объект с двумя свойствами, fieldName и errorMessage.

// Returns the name of an object's first key 
function getKeyName(obj) {
   for (var prop in obj) {
       return prop;
   }
}

// This is the response from the server
var response = { "invalid":[{"field1":"Field 1 is required"}] };

// This is going to be the massaged array that
// contains more meaningful information.
var invalids = [];
for (var i=0; i < response.invalid.length; i++) {
  var obj = response.invalid[i];
  var key = getKeyName(obj);
  invalids.push({fieldName: key, errorMessage: obj[key]})
}

Теперь invalids содержитмассив более значимых объектов сообщений об ошибках, таких как invalids = [{fieldName: 'field1', errorMessage: 'Field 1 is required'}] Просто передайте этот объект вашей процедуре проверки.Если возможно, я бы изменил код сервера, чтобы он возвращал сообщения об ошибках в формате, который я предложил, чтобы вам не пришлось выполнять дополнительную работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...