Как я могу получить первое сообщение об ошибке из списка, возможно, более одного?

У меня есть сообщения об ошибках в следующем формате:

{
 "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'  );

http://jsfiddle.net/A2dA9/

Большинство современных браузеров поддерживают 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]];

(Я не проверял этот синтаксис, но это что-то вроде этого)

(обратите внимание, что "первый элемент" может быть немного произвольным, я не уверен, что он гарантирует порядок, в котором ключи будут возвращены, хотя на практике я ожидаю, что вы найдете его довольно надежным)

Другие вопросы по тегам