0

バージョン 1 とバージョン 2 で子の名前を取得したいです。以下の子の名前の例は、「顧客」と「請求書」です。

javascriptを使用してどのように取得しますか?

Errors.Version1.[0] を試してみました 名前を取得しますが、うまくいかないようです。Errors.Version1.Customer は変更される可能性があるため、使用したくありません。「顧客」または「請求書」のいずれかです。どんな名前でも取得したいだけです。

ありがとう!

JSON の例

{
  "Errors": [
    {
      "Version1": {
        "Customer": {
          "BillAddr": {
            "Id": "Id1",
            "Line1": "Line11",
            "Line2": "Line21",
            "Line3": "Line31",
            "Line4": "Line41",
            "Line5": "Line51",
            "City": "City1",

          }
        }
      },
      "Version2": {
        "Invoice": {
          "BillAddr": {
            "Id": "Id1",
            "Line1": "Line11",
            "Line2": "Line21",
            "Line3": "Line31",
            "Line4": "Line41",
            "Line5": "Line51",
            "City": "City1",

          }
        }
      }
    }
  ]
}
4

3 に答える 3

2

正しい表記は

Errors[0].Version1[0] // however still won't work

json に追加の配列ラッパーがあり、表記法が混在しているためです。
ただし、オブジェクト プロパティは、順序が保証されていないため、インデックスでアクセスできません。Version1したがって、配列に変換するかVersion2、プロパティに名前でアクセスする必要があります。

Errors[0].Version1["Customer"] //works for your current markup

また、ドット表記object.property またはブラケット表記のいずれかを使用object["property"]してください。混在させることはできません。

以下は Notation で機能しますErrors.Version1[0]

{
  "Errors":
    {
      "Version1": [
        {
          "BillAddr": {
            "Id": "Id1",
            "Line1": "Line11",
            "Line2": "Line21",
            "Line3": "Line31",
            "Line4": "Line41",
            "Line5": "Line51",
            "City": "City1",

          }
        }
      ]
    }
}

配列として、順序は固定されることが保証されていますが、配列にはキーがなくインデックスしかないため、情報顧客を失います。

于 2012-11-05T23:28:20.203 に答える
2

オブジェクト プロパティをインデックスとして参照することはできません。言い換えれば、あなたはできません:

var foo = {a:1};
foo[0]; // Doesn't work

ただし、できることは、インデックスと同様の構文を使用してプロパティを参照することです。

var foo = {a:1};
foo[someBoolean ? 'Customer' : 'Invoice']; // Does work

しかし、オブジェクトの名前に関係なく、オブジェクトの任意のプロパティを取得したいだけですか? それでは、それらを反復処理する必要があります。

var foo = {randomName:1};
for (var key in foo) {
    // key=="randomName"
    // foo[key]==foo["randomName"]==foo.randomName==1
    // do whatever you want with foo[key];
}

ただし、カスタム プロパティを追加するライブラリを使用すると混乱する可能性があるため、ネイティブ JS ではなくライブラリ (Underscore と jQuery の両方に独自の "each" 関数があります) を使用することをお勧めします。

于 2012-11-05T23:28:33.613 に答える
1

どちらか一方しかできない場合は、簡単なテストを行ってください。

var type = ("Customer" in Errors[0].Version1) ? "Customer" : "Invoice",
    obj  = Errors[0].Version1[type];

これらの2つの可能な結果よりも動的である場合for ... inは、オブジェクトのキーを介して反復を実行する必要があります。

そうは言っても、このデータ形式の100%の所有権があり、それを変更できる場合は、error_type推測するのではなく、1つのレベルを削除し、代わりにエラーにプロパティを与えることをお勧めしますか?

{
    Errors : [{
        Version1 : {
            ErrorType : "Customer",
            BillAddr : {
                Id    : "Id1",
                Line1 : "Line11",
                Line2 : "Line21",
                Line3 : "Line31",
                Line4 : "Line41",
                Line5 : "Line51",
                City  : "City1"
            }
        },

        Version2 : { /* ... */ }
    }]
}

または、VersionXオブジェクトではなく配列を作成することもできます。そのために、複数のエラーをオブジェクトとして保持し(独自のエラータイプのプロパティを使用)、その時点で、何を処理しているかを把握します。終えた:

Errors[0].Version1[0].ErrorType;

非常にシンプルになります。

于 2012-11-06T00:42:52.103 に答える