2014-08-29 61 views
0

我正在使用ember-data的ember,我需要從嵌套的錯誤響應中獲取一個值。從嵌套的JSON中採集值

如果我的後端無效它可以用這樣的迴應:

{"error":{"message":{"invalid input":{"email":["The email has already been taken."]}}}} 

不過,我不知道第三或第四嵌套值冷是什麼,所以我只需要採摘第五值,誤差信息。

這是我有:

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); 

這將是馬麗娟如果你能採摘它使用了許多像我有,但顯然它不喜歡的工作。是否有一個函數,燼或jQuery的,讓我做到這一點?

+0

是否總是嵌套'5'深?它總是一個包含字符串的數組嗎?所有的嵌套對象總是沒有兄弟姐妹? – 2014-08-29 17:07:10

+0

不熟悉ember語法,但不需要最後一行中的onSuccess()和failure()? (也就是在函數名中加上括號? – WillardSolutions 2014-08-29 17:07:39

+0

@EatPeanutButter:不,他沒有,他把上面聲明的函數作爲參數傳遞。 – Mchl 2014-08-29 17:08:57

回答

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)); 

http://jsfiddle.net/aaku72n0/

它會檢查,看看是否在傳遞的對象是一個字符串,如果它是不是會重複使用對象的第一個屬性。這假設沒有兄弟姐妹(或者至少,你只想走在每個級別的第一個兄弟姐妹),但可以適應。

如果你知道它總是處於第五級,這可能會進一步簡化。

該函數並不關心字符串嵌套的深度。它會繼續搜索,直到找到它。因此,這些都會產生相同的結果:

GetDeepest(e); 
GetDeepest(e.error); 
GetDeepest(e.error.message); 
+0

這很好... – Mchl 2014-08-29 17:17:40

+0

我喜歡這個,感謝你。一個簡單的問題,我非常新的燼,如果我想重用它,我應該把它放在哪裏?必須有一個實用程序或幫助類在某處 – 2014-08-29 17:29:02

+0

@ nbs189:我不熟悉燼,所以我不能說真的,這只是普通的Javascript,所以應用了相同的規則,但它是有道理的,如果你只是在'failure'處理程序中使用它,你甚至可以嵌套它在裏面。 – 2014-08-29 17:32:19

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]; 
}; 
+0

'.getOwnPropertyNames'包含不可枚舉的屬性以及可枚舉的。不知道這對於'.keys'實際上是否可取,但值得注意。我也會試着製作'pluck(object,idx)'函數(如果沒有提供,idx = 0),因爲爲什麼不呢。 – 2014-08-29 17:22:38

+1

這裏有一個區別,如果你做'pluck([])'它會返回'0',爲什麼?因爲'getOwnPropertyNames'將返回'length',所以它返回空數組的長度。用'.keys'代替'.getOwnPropertyNames'就意味着'pluck([])'返回'undefined'。 – 2014-08-29 17:30:09