1

奥行きが最大 3 のオブジェクトがあります。

OBJ.T.V.E={...}

T と V は ( OBJ[0][1]['String']={...} のように) 整数であるため、典型的な構造は次のようになります。

OBJ[0][0]['S1']={..}
OBJ[0][0]['S2']={..}
OBJ[0][1]['S1']={..}
OBJ[0][2]['S1']={..}

私は再配置して何とかこれを取得したい:

OBJNEW['S1'][0][0]={...}

と同じ値になりますOBJ[0][0]['S1']

私は運がなくて何時間も苦労しています。何か案は?Jqueryコードも大歓迎です。

編集:今、私はそのようなオブジェクトの配列を作成しようとしました:

OBJ2=[];
$.each(OBJ, function(name, value) {
  $(value).each(OBJ, function(name1, value1) {
    OBJ2[name1]=[];
    $(value1).each(OBJ, function(name2, value2) {
      OBJ2[name1][name2]={};
      OBJ2[name1][name2]['S1']={};
    })
  })

しかし、各 ...['S1'] 割り当てが前のオブジェクト (たとえば S2) を上書きするため、このステップは失敗します。

タイプミスは無視してください。ロジックを再作成したところです。

4

2 に答える 2

3

私が誤解しない限り、これはあなたをかなり遠ざけるはずです。

function flipObject(o) {
  var i1, i2, i3, result = {};

  for ( i1 in o ) {
    if ( o.hasOwnProperty(i1) ) {
      for ( i2 in o[i1] ) {
        if ( o[i1].hasOwnProperty(i2) ) {
          for ( i3 in o[i1][i2] ) {
            if ( o[i1][i2].hasOwnProperty(i3) ) {
              if ( !(i3 in result) ) result[i3] = {};
              if ( !(i1 in result[i3]) ) result[i3][i1] = {};
              result[i3][i1][i2] = o[i1][i2][i3];
            }
          }
        }
      }
    }
  }
  return result;
}

それは変わります

{
    "0": {
        "0": {
            "s1": "s1.0.0",
            "s2": "s2.0.0"
        },
        "1": {
            "s1": "s1.0.1",
            "s2": "s2.0.1"
        }
    },
    "1": {
        "0": {
            "s1": "s1.1.0",
            "s2": "s2.1.0"
        },
        "1": {
            "s1": "s1.1.1",
            "s2": "s2.1.1"
        }
    }
}

の中へ

{
    "s1": {
        "0": {
            "0": "s1.0.0",
            "1": "s1.0.1"
        },
        "1": {
            "0": "s1.1.0",
            "1": "s1.1.1"
        }
    },
    "s2": {
        "0": {
            "0": "s2.0.0",
            "1": "s2.0.1"
        },
        "1": {
            "0": "s2.1.0",
            "1": "s2.1.1"
        }
    }
}
于 2012-05-27T20:05:08.170 に答える
1

[]元のコードの問題のいくつかは、プレーン配列を連想配列として使用できないことです{}。文字列キーは、連想配列でのみ使用できます。次の問題は、文字列キーをハードコーディングするのではなく、すべての文字列キーを反復処理できることと、反復する必要があることです。

実行できる最も簡単な方法は、元のオブジェクトの階層の各レベルに対して書き込みfor/ループを行い、新しいオブジェクトに書き込むときに割り当てを反転することです。inまた、親キーが存在するかどうかを確認し、存在しない場合は作成する必要があります。

var NEWOBJ = {};

for (var outerKey in OBJ) {
  for (var innerKey in OBJ[outerKey]) {
    for (var stringKey in OBJ[outerKey][innerKey]) {
      NEWOBJ[stringKey] = NEWOBJ[stringKey] || {};
      NEWOBJ[stringKey][outerKey] = NEWOBJ[stringKey][outerKey] || {};
      NEWOBJ[stringKey][outerKey][innerKey] = OBJ[outerKey][innerKey][stringKey];
    }
  }
}

console.log(NEWOBJ);​

私の知る限り、jQueryはここであなたを助けるためにほとんど何もしません。同じことを実現するネイティブJavascriptよりも実際にはそれほど単純ではありません。

これは、移動しているオブジェクトのディープコピーを実行しないことに注意してください。オブジェクトを変更すると、NEWOBJで変更されると思いますOBJ。この問題を一般的に解決するのは難しいと思います。おそらく、オブジェクトタイプごとにカスタムコピーオブジェクトを使用する必要があります。

また、私はJavascriptGURUではないことに注意してください。hasOwnPropertyこのような例では、解決できるオブジェクトのプロパティを反復処理するときに問題が発生することがあります。しかし、それらの問題が頭から離れているのかはわかりません。たとえば、私はこのコードを単純なJSONオブジェクトで試しましたが、機能しました:)

http://jsfiddle.net/e9uST/-ブラウザのJavascriptコンソールを使用して出力を確認します。

于 2012-05-27T20:05:58.147 に答える