2017-07-05 6 views
1

JSONからオブジェクトを作成しようとしています。帯域幅を節約するためにネストしたオブジェクトのデフォルトのフィールド値

a: { 
    name: "A name", 
    b: { 
     c: { 
     d: [] 
     } 
     } 
    } 

、空の配列と空のオブジェクトをJSONから取り除かれるように私のオブジェクトの

一部が見えますので、私はちょうど変換する場合は、私が受け取るJSONは

{ "a": { "name": "A name" }} 

ですオブジェクトへのJSONの場合、undefinedには長さがないため、これはa.b.c.d.lengthのようなものを実行しようとするとエラーになります。現時点で

は、私が

const json = getJson(); 
const obj = { 
    ...json, 
    a: { 
     ...json.a, 
     b: { 
      ...json.a.b, 
      c: { 
      ...json.a.b.c, 
      d: json.a.b.c.d || [] 
      } 
      } 
     } 
    }; 

のようなもので欠落しているフィールドを移入していますこれはかなり冗長で、デフォルト値を必要とするいくつかのフィールドがある場合でも、醜い取得する予定です。

明白な解決策の1つは、送信されたJSONから空の配列を削除しないことです。それが不可能であると仮定して、このケースを扱う良い方法はありますか?

実際のケースでは、各レベルに複数のフィールドがあるため、すべてのスプレッド演算子が必要です。 (そうでない場合でも、将来的に構造が拡大する可能性があるため、それらを含めることができます)

編集:私はJQueryを使用していません。私はwhatwg-fetchを使ってデータを検索しています。

+0

_.get(object, 'property.path.here') 
明確にすること、これはES6/2015ないが、これは[ECMAScriptのためのステージ3案(https://github.com/tc39/proposal-object-rest-spread) –

+0

@damaあるIそれがあなたが思っているように細かい制御として達成するとは思わない。 askerは '{a:{b:{c: 'hello'}}}、{a:{d:{e: 'さようなら}}})'実際にちょうど '{a:{d:{e: 'さようなら'}}}' **を取得します**私の間違い、オプションの第1引数 'deep'を忘れました。これは動作します: '$ .extend(true、{a:{b:{c: 'hello'}}}、{a:{d:{さようなら}}})' –

答えて

0

ベストプラクティスとして、洗練されたアプローチや構文を使用しないでください。あなたが何かをしようとしているが、あなたはそれを達成することができますが、コードの品質が悪くなる

var _d = a.b.c.d || []. 
// does something with _d.length 

: ただのJavascriptの設定一般的なデフォルト値を使用します。異なったと思って、それをより良くするかもしれません。

また、元のオブジェクトを明示的にすべてのプロパティで宣言すると、空のプロパティを削除するよりも優れていると思います。

+0

私は一般的に「過度に複雑な」アプローチを避けていますが、質問者の「帯域幅を節約する」テクニックを悪い習慣で過ごすのは間違いだと思います。私はJSONが彼が言っているほど大きければ、空のオブジェクトや配列を省略すると、デフォルト値のためにある種のスキーマを確立する限り、長期的には多くのリソースを節約することになると思います。 –

+1

はい、状況によって異なります。私はちょうど片方の方法に従うことを強く主張する別のアプローチを開きます。 –

2

私はあらかじめ決められたスキーマを確立し、空の配列/値を省略し続ける解決策を提案します。あなたはその後、空のオブジェクトを削除し、空の文字列""0nullとしてスキーマによって決定されるdefaultValuelodash.get()

_.get(object, 'property.path.here', defaultValue) 

、など

2

ような何かを行うことができます/応答からの配列が良くありませんこれらは有効な値になる可能性があるためです。

時期尚早な最適化です。パフォーマンスに実質的な利点はありません。代わりに、それはあなたが特別に各応答を処理する必要があるときに頭痛を与えるでしょう。

しかし、それでも価値があると思うなら、私はlodash getの機能をお勧めします。

関連する問題