2016-11-02 5 views
2

属性(または入れ子オブジェクト)は、条件に基づいて動的に選択されます。JSオブジェクト内の動的に指定された属性を置き換える方法

次に、私はこの新しいデータを取得し、上記で選択したものを置き換えたいと考えています。

var newData = //some new Object 

私は上記のものをすべて新しいデータで置き換えたいと考えています。私は次のことを行うことができます(条件を再確認して新しいデータを設定してください):

 if(o.title){ 
       if (o["properties"]) { 
        o["properties"] = newData; 
       } else if (o["items"]["properties"]) { 
        o["items"]["properties"] = newData; 
       } 
     }else{ 
       if (o[k]["properties"]) { 
        o[k]["properties"] = newData; 
       } else if (o[k]["items"]["properties"]) { 
        o[k]["items"]["properties"] = newData; 
       } 
     } 

しかし、それは良くありません。これを達成するより洗練された方法は何ですか?

+0

サンプルデータを提供できますか? – JosephGarrone

+1

'tempData'に' properties'を設定したいオブジェクトを格納し、 'tempData.properties = newData;'のようなことをするのがより良い方法です。データにアクセスするには、 'tempData'の代わりに' tempData.properties'を使用します(もちろん、 'tempData'にはより良い名前を付けるべきです)。 –

+1

短い回答番号javascriptがポインターをサポートしていない限り、単純な方法はありません。 –

答えて

1

一般的に置き換えようとしているかどうかは不明です任意のpropertiesプロパティをnewDataに設定するか、コード内で指定したものの1つにする場合は、私はあなたがあなたのコードで特に示したものを置き換えるだけと思っています。

注:以下は、propertiesプロパティの値がfalseに評価されないことを前提としています。 falseと評価される値を持つことが可能な場合、これは失敗します。

  • onullundefinedではありません:に依存しているが

    var p; 
    if (o.title) { 
        p=o; 
    } else { 
        p=o[k]; 
    } 
    if (p.properties) { 
        p.properties = newData; 
    } else if (p.items.properties) { 
        p.items.properties = newData; 
    } 
    

    、:

    最初のパスとして、私のような何かをするだろう。

  • o.titleo.titleの存在をテストしようとしている場合、falseに評価されません。
  • kが有効/定義されています。
  • p(すなわちo[k]nullまたは未定義ではありません(つまり、オブジェクトである)あなたが存在
  • p.itemsのためにテストする場合
  • p.propertiesは、falseに評価されないnullまたは未定義ではありません(すなわち、

    if (typeof o === 'object' && o !== null) { 
        var p; 
        if (o.hasOwnProperty('title')) { 
         p = o; 
        } else { 
         p = o[k]; 
        } 
        if (typeof p === 'object' && p !== null) { 
         if (p.hasOwnProperty('properties')) { 
          p.properties = newData; 
         } else if (typeof p.items === 'object' && p.items !== null 
            && p.items.hasOwnProperty('properties')) { 
          p.items.properties = newData; 
         } 
        } 
    } 
    

    これはまだ依存している:

    • p.items.propertiesは、あなたが存在

    のためにテストしている場合は、より堅牢な実装は次のようになり、falseに評価されない)オブジェクトであります

  • kが有効/定義されています。

基本的に、それはあなたがoため

  1. 可能な値は、あなたのコードがエラーをスローするかもしれないものを挙げることができないことがわかっている場合は、存在するかどうかをテストするためにif(o.title)のようなショートカットを使用してOKです(たとえば、 oは、プロパティが実際に存在する場合はfalseに評価されていないnullまたはundefined)、および
  2. o.titleに可能な値である(例えばo.titlenull、です0(はい、プロパティは存在しますが、値はundefinedです)、false0''など)。

あなたはあなたのコードの他の領域に置換を実行しようとしている、またはあなたがハードコーディングされitems以外のプロパティキーを使用しよう、とpropertiesしている場合は、関数を作成する必要があります。 コードのこのセクションでこの置換を実行すると、変数を使用して、探しているオブジェクトを保持すると、propertiesは関数を作成するよりも高速で効率的です。

+0

@SachiDangalla、私はこの回答をより堅牢なコードで更新しました。あなたが 'if'ステートメントで行っているチェックのいくつかがプロパティの存在をチェックするだけであるか、存在のテストに加えてプロパティの値をテストしていることを知っているのであれば、あなたの質問からは明らかではありません。 'properties'キーがどこにあるのかわからないことを考えると、' o'をあまり支配していない可能性があり、コードは無効な値(または少なくとも 'プロパティの値'これは' false'と評価されるかもしれません。 – Makyen

1

ここでわかるように、「プロパティ」を新しいデータに置き換えようとしているようなものです。これを動的に実行できるようにしたいと思っています。構造に関係なくこれを行います。

あなたの目的は、「プロパティ」で終わるものである。このようにそれを行うことができます場合は、見ることができます:

function recReplace(current,target,replacement){ 
    for (var i in current){ 
      if (i == target){ 
       current[i] = replacement; 
      } 
      else{ 
       recReplace(current[i],target,replacement); 
      } 
    } 
} 

そして、最後にあなたが

recReplace(o,"properties",newData); 

を呼び出すしかし、これは交換いたしますDFSの方法でnewDataを使用して全体の「プロパティ」キーを使用すると、最初の発生のみを置き換える場合は、条件付きで追加することができます

+0

私はすべてのキーをループし、ここで再帰的にやってもいいとは思わない。これと比較してOPの方が優れています。 –

+1

彼のニーズに応じて、彼の要求は曖昧です...彼がやろうとしていることを理解しようとしています –

関連する問題