2017-10-18 5 views
0

JSが情報を取得するために使用できるように、値がサーバーによってデータ属性を介して渡されるAPIを作成しています... My JSはAJAX呼び出し、JSONオブジェクトが返されます...JavaScript:文字列を変換し、それを連結してオブジェクトプロパティリファレンスを動的に作成する

ブランドを得るために
{ 
    "data": { 
     "results": { 
      "type": [ 
       { 
        "cars" : { 
         "brands": { 
          "ford" : {}, 
          "honda" : {} 
         } 
        } 
       } 
      ] 
     } 
    } 
} 

、私はちょうど

let brand = data.result.type[0].cars.brands.ford 

私は私が必要とする結果を得ることができるこの方法を入力し、私はこれを構築する必要があります経路の2つの部分を結合することによって、経路を動的に決定する。私が質問の冒頭で言ったように、いくつかの情報はデータ属性を介して渡され、情報はtype[0].cars.brands.ford ...私はdata.resultに私のコードで参加する必要があります。私は現在、とても

entry.querySelectorAll('[data-brand]').forEach((e) => 
    let brand = eval('data.result.' + e.dataset.brand); 
) 

のように、eval()を使用することによって、所望の結果を得ることができることだ私はあなたの多くがeval()を使用することが悪いですし、私はそれを非常に意識だと言うだろうけど、私はできませんでしたこれを実現させるための良い方法を見つけてください。別の問題があります。ブランドの場合、nissanはJSONにありません。エラーが発生します。TypeError: Cannot read property 'nissan' of undefined ...プロパティが存在するかどうかを確認することで回避できますコードを継続していますが、eval()が含まれている場合、この種のテストを行う方法はわかりません。

だから... ...基本的に、私は必要なもの、動的にプロパティが存在するかどうかを確認するために試験することができるプロパティパスを構築するためのより良い方法です...事前に

おかげで...

+1

あなたは[「PROPERTY_NAME」] – Danmoreng

+0

をdata.result使用することができます答えをありがとう、しかし私はすでにそれを試み、動作しませんでした... –

+0

正確に何が動作しないのですか? – Danmoreng

答えて

0
サポートブラケットをdoenst
const brand = e.dataset.brand.split(".").reduce((obj,id) => obj[id] || {}, data.results); 

、そう:

type.0.whatever.keys 

を(代わりに空のオブジェクトの)非存在しないキーに対して未定義戻るには:

const brand = e.dataset.brand.split(".").reduce((obj,id) => (obj || {})[id], data.results); 
+0

非常に非常にありがとう...私はしなかった'reduce()'について知っています...もっと詳しく調べてみましょう...完全に機能しました。データ型を調整して、 'type [0] .cars.brands.ford'を'type.0.cars。brand.ford' –

+0

@paulo youre welcome;) –

+0

ちょうど1つの質問...私は '' Type1Rror:ブランド 'nissan'が設定されていないため、プロパティ' sentra 'が未定義です。これは存在しません 'type.0.cars.brands.nissan.sentra' ...親プロパティが存在しないときに' reduce() 'の反復を止めるにはどうすればいいですか?あなたは知っていますか? –

-1

パスを使用してオブジェクトの値にアクセスできるように、lodash getメソッドを確認することができます。

lodashが大きすぎる場合は、その実装を確認してください。

+0

助けてくれてありがとう、しかし私はロダシュが私のニーズのために大きいと信じている... –

0

あなたがあれば、データを確認することができます。結果にはまずプロパティがあり、次に変数をブランドにします:

if(data.result.hasOwnProperty(e.dataset.brand)){ 
    let brand = data.result[e.dataset.brand]; 
} 
+0

私はすでにそれを試しましたが、うまくいきません...結果として 'undefined'が返されます... –

+0

' data.result'にループしているブランドがない場合に起こります。 – Danmoreng

0

あなたはString#match、すべてのキーを見つけ、その後Array#reduceを使用してキーを反復処理し、オブジェクトからキー値を取得することができます。

const obj = {"data":{"results":{"type":[{"cars":{"brands":{"ford":{"name":"ford"},"honda":{"name":"honda"}}}}]}}}; 
 

 
const brand = 'data.results.type[0].cars.brands.ford'; 
 

 
const getPathValue = (src, path) => path.match(/[^.\[\]]+/g) 
 
    .reduce((p, k) => typeof p === 'object' ? p[k] : p, src); 
 

 
const brandOBj = getPathValue(obj, brand); 
 

 
console.log(brandOBj);

関連する問題