我正在使用带有ember-data的ember,我需要从嵌套的错误响应中获取值。
如果我的后端无效,它可能会回复如下:
{"error":{"message":{"invalid input":{"email":["The email has already been taken."]}}}}
但是,我不知道第3或第4个嵌套值是什么,所以我只需要取第5个值,即错误信息。
这就是我所拥有的:
function onSuccess(){
this.transitionTo('login');
Notify.success("You are now registered! You can now login.");
};
function failure(reason){
Notify.alert(reason.responseText.5);
};
...
//Omitted for brevity.
...
//Ember promise returns true or false.
user.save().then(onSuccess).catch(failure);
如果你能用我喜欢的数字把它拔出来,那将会很有吸引力,但很明显它并不像那样。是否有一个函数,ember或jQuery允许我这样做?
答案 0 :(得分:1)
这样的事情(或其变体)可以起作用:
var e = {"error":{"message":{"invalid input":{"email":["The email has already been taken."]}}}} ;
function GetDeepest(obj) {
if (typeof obj === "string") {
return obj;
}
else if (typeof obj === "object") {
return GetDeepest(obj[Object.keys(obj)[0]]);
}
}
console.log(GetDeepest(e));
它将检查传入的对象是否是字符串,如果不是,它将使用对象的第一个属性递归。这假设没有兄弟姐妹(或者至少,你只想沿着每个级别的第一个兄弟姐妹走下去),但可以进行调整。
如果您知道它始终处于第5级,则可以进一步简化。
此函数并不关心字符串嵌套的深度。它会一直搜索,直到找到它为止。所以这些都会得到相同的结果:
GetDeepest(e);
GetDeepest(e.error);
GetDeepest(e.error.message);
答案 1 :(得分:1)
function pluck(object) {
return object[Object.getOwnPropertyNames(object)[0]];
}
function failure(reason){
var message = reason.error.message; //let's skip two levels right away
var messageText = pluck(pluck(message))[0];
};