2017-03-13 5 views
1

Angularアプリでは、サーバーからのHTTP応答がJSONオブジェクトとしてエラーが発生しています。私はそれらをすべて文字列に結合して、それらをユーザーにメッセージとして表示したいと考えています。現時点で オブジェクトの値を動的キー名の文字列に結合する

は、私はこれを行っている:

if ("errors" in emsg.error) { 
    let msg = emsg.error.map(o => o.name).join(', '); 
} 

はしかし、私は別のキー名とリターンのすべての異なる場合のためにそれを記述する必要があります。私の応答の例は、このいずれかになります。

{ 
    "error":{ 
     "message":"422 Unprocessable Entity", 
     "errors":{ 
     "id":[ 
      "The id has already been taken." 
     ], 
     "name":[ 
      "The name has already been taken." 
     ] 
     }, 
     "status_code":422 
    } 
} 

だから、私の応答は、動的オブジェクト名を持つことができ、それらのそれぞれが複数のエラーを有することができます。上のコードを同じフォーマットのすべての応答を扱う汎用コードに変換する方法はありますか?

+0

オブジェクト名 'error'が動的に変更される可能性がありますか?または 'errors'? – RaR

+0

for-inまたはforEachを使用した反復が機能しない何らかの理由はありますか?あなたはそれを試していないのですか? – ryanlutgen

+0

@RaR "id"と "name"のキーはフォームの送信に基づいて変更されることがあります。 – Tasos

答えて

1

オブジェクトキーを取得し、キー配列を繰り返します。キーが存在する場合、その値

var emsg = { 
 
    "error":{ 
 
     "message":"422 Unprocessable Entity", 
 
     "errors":{ 
 
     "id":[ 
 
      "The id has already been taken." 
 
     ], 
 
     "name":[ 
 
      "The name has already been taken." 
 
     ] 
 
     }, 
 
     "status_code":422 
 
    } 
 
} 
 
var keys = Object.keys(emsg.error.errors); 
 
let msg = keys.map(o =>emsg.error.errors[o]).join(', '); 
 
console.log(msg)

2

var emsg = { 
 
    "error":{ 
 
     "message":"422 Unprocessable Entity", 
 
     "errors":{ 
 
     "id":[ 
 
      "The id has already been taken." 
 
     ], 
 
     "name":[ 
 
      "The name has already been taken." 
 
     ] 
 
     }, 
 
     "status_code":422 
 
    } 
 
}, array = []; 
 

 
// push all error values into array 
 
for (var key in emsg.error.errors) { 
 
    Array.prototype.push.apply(array, emsg.error.errors[key]); 
 
} 
 

 
console.log(array.join(', '));

あなたがlodashを使用することができる場合、あなたは、よりエレガントに

_.flatMap(emsg.error.errors).join(', '); 
をそれを行うには flatMapを使用することができますに参加
関連する問題