Как я могу получить первое сообщение об ошибке из списка, возможно, более одного?
У меня есть сообщения об ошибках в следующем формате:
{
"message":"The request is invalid.",
"modelState":{
"model.ConfirmPassword":["The password and confirmation password do not match."]
}
}
{
"message":"The request is invalid.",
"modelState":{
"model.Email":["The Email must be at least 10 characters long."],
"model.ConfirmPassword":["The password and confirmation password do not match."]
}
}
Я знаю, как получить modelState, но как я могу получить первое поле сообщения в modelState, когда это поле может каждый раз отличаться?
- В первую очередь я хотел бы получить сообщение: "Пароль и пароль подтверждения не совпадают".
- И во втором случае сообщение: "Адрес электронной почты должен быть не менее 10 символов".
4 ответа
Вы можете перебрать все свойства объекта, используя Object.keys или метод hasOwnProperty
for (var k in modelState) {
if (modelState.hasOwnProperty(k)) {
var error_message = modelState[k][0];
// k => "model.Email"
// error_message => "The Email must be at least 10 characters long."
}
}
Исходя из того факта, что ключи объектов JS по своей природе неупорядочены, я бы предложил рефакторинг вашего ответа modelState (в любом случае у вас есть массив как значение):
var response = {
"message":"The request is invalid.",
"modelState": {
"errors": ["Bad email", "Bad password"]
}
}
console.log( response.message, response.modelState.errors[0] );
V2: На основании того факта, что ключи объектов JS по своей природе неупорядочены, вы можете добавить определенный порядок приоритетов ошибок.
var response = {
"message":"The request is invalid.",
"modelState":{
"model.Email":["The Email must be at least 10 characters long."],
"model.ConfirmPassword":["The password and confirmation password do not match."]
}
}
var priorities = ["model.Email", "model.ConfirmPassword"];
var selectedError = null,
idx = 0;
do {
selectedError = response.modelState[ priorities[ idx ] ];
selectedError = selectedError ? selectedError[0] : null;
idx++;
} while ( !selectedError && idx < priorities.length );
console.log( selectedError || 'Unknown error' );
Большинство современных браузеров поддерживают Object.keys
метод
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
Вы можете использовать это для получения массива из вашего modelState, который будет возвращать ["model.Email", "model.ConfirmPassword", ... ] в каждом случае.
Затем просто получите первый элемент из этого возвращаемого массива и вызовите его, так что-то вроде:
var keys = modelState.keys;
var firstError = modelState[keys[0]];
(Я не проверял этот синтаксис, но это что-то вроде этого)
(обратите внимание, что "первый элемент" может быть немного произвольным, я не уверен, что он гарантирует порядок, в котором ключи будут возвращены, хотя на практике я ожидаю, что вы найдете его довольно надежным)