2016-06-23 7 views
0

アクセスしようとしているJSONがあります。evalを使用せずにJavascriptでネストされたJSON要素にアクセスする

{  
"orders": { 
    "errorData": { 
    "errors": { 
     "error": [ 
     { 
      "code": "ERROR_01", 
      "description": "API service is down" 
     } 
     ] 
    } 
    }, 
    "status": "fail" 
} 
} 

私は構造が変化する可能性があり、私は再ファクタリングは、あらゆる場所にアクセスすることにしたくないので、JSONを参照するために、定数を宣言することができるようにしたいです。 「ステータス」キーにアクセスして定数を使用したいとします。データはJSONオブジェクトを参照します。私は(これは活字体である)試みることができる:

public static STATUS : string = "data["orders"]["status"]"; 
var status_value = STATUS; 

問題は、これは単に実際にそれを評価していない、変数「STATUS_VALUE」に文字列のSTATUSを割り当てていることです。私はSTATUSでevalを呼び出すことができましたが、私はそれを避けたいと思います。私はループの答えがあることを知っているが、私はコード全体にこれからアクセスするので、それは少し余裕があるようだ。 (Angular 2アプリなので、バックエンドコールがたくさんあり、JSONを解析しています)

私は定数としてループ関数を書くことができますか?私はJavascriptを初めて使うので、どんなアドバイスも素晴らしいだろう。

+0

なぜ 'data ['order'] ['status']'だけではないのですか?私はあなたのユースケースを理解していません。おそらくあなたは正当な理由がありますが、私はそれを得ません。なぜ文字列にする必要があるのですか?文字列を評価する必要があるのはなぜですか?なぜオブジェクト/値を渡すことができないのですか? – BotNet

+0

私はアクセスを1か所に入れたいと思っていましたが、オブジェクトを渡すことに気づいていませんでした。サービスとコンポーネントが異なるため、複数のタイスクリプトファイルにアクセスする必要があります。答えは、他のクラスにインポートできる静的メソッドを持つクラスをエクスポートするファイルです。 –

答えて

1

ステータスが一度に変更できない場合は、変数にdata.orders.statusの値を代入し、ちょうどあなたのコード全体でその変数を使用してロードされました。

public static STATUS : string = data.orders.status; 

(またはtypescript構文が何であれ)。

状態はページの後変更が機能を使用して、コード全体でその関数を呼び出してロードされていることができた場合:オブジェクトの構造の詳細はstatusフィールドに到達するために必要ないずれかの方法を

function getStatus() { return data.orders.status; } 

コード内の1か所にしか記述されていません。

+0

その短い関数の構文はまさに私が探していたものです。 –

-1

しかし私は別の考え方を持っています。リストにキーを保存せず、それらのキーの値を順番に取得することで値を計算してみてはどうでしょうか。私はTypeScriptを知らないので、私はJavascriptで自分の答えを書いている、あなたはアイデアを得るでしょう。

public static STATUS : string = ["orders", "status"]; 
var status_value = angular.copy(data); 
STATUS.forEach(function(key){ 
    status_value = status_value[key]; 
}); 
+0

@Barton Durbinもしあなたが 'eval'を使いたくない場合や、この問題を解決する方法を変更したくない場合は、なぜここに投稿していますか? –

関連する問題