17

json配列オブジェクトを反復処理する必要があります。

以下の構造になっています。

var myJSONObject = {
    "abc": {
        "prod_1": [
            {"prod_ver" : "prod 1 ver 1"},
            {"prod_ver" : "prod 1 ver 2"},
        ],
        "prod_2": [
            {"prod_ver" : "prod 2 ver 1"},
            {"prod_ver" : "prod 2 ver 2"},
        ],
        "prod_3": [
            {"prod_ver" : "prod 3 ver 1"},
            {"prod_ver" : "prod 3 ver 2"},
        ]
    }
};

基本的に私がやっていることはprod_1が製品の名前であり、prod_1が持っているバージョンのリストがその中に入力されています。

だから今私が欲しいのは製品の名前とそれが持っているバージョンです。

問題は、その製品の下に多くの製品と多くのバージョンが存在する可能性があることです。だから私はそれを処理するために一般的であることができるjavascriptの適切なループ構造が必要です。

製品名をチェックする必要があるので、ループが製品名を1つの変数に格納し、そのバージョンを別の変数に格納するのが最適です。

json構造が間違っているか、より良いjson構造を記述できる場合は、正しい/より良い構造を提案してください。

助けてください

前もって感謝します。

4

4 に答える 4

19

製品のリストが含まれているため、プロパティを配列としてmyJSONObject.abc定義する方が理にかなっています。abcこのような:

var myJSONObject = 
{
"abc":
    [
        [
            {"prod_ver" : "prod 1 ver 1"},
            {"prod_ver" : "prod 1 ver 2"},
        ],
        [
            {"prod_ver" : "prod 2 ver 1"},
            {"prod_ver" : "prod 2 ver 2"},
        ],
        [
            {"prod_ver" : "prod 3 ver 1"},
            {"prod_ver" : "prod 3 ver 2"},
        ]
    ]
};

次に、通常のループを使用して、製品とそのバージョンを反復処理できます。

for(var i = 0; i < myJSONObject.abc.length; i++)
{
    var product = myJSONObject.abc[i];
    for(var j = 0; j < product.length; j++)
    {
        var version = product[j];
    }
}

それをもう少し進めて、JSONオブジェクトの構造を少し変更して、理解しやすくすることができます。

var catalog = 
{
    "products": [
        {
            "name": "prod 1",
            "versions": [
                "ver 1",
                "ver 2"
            ]
        },
        {
            "name": "prod 2",
            "versions": [
                "ver 1",
                "ver 2"
            ]
        }
    ]
};

for(var i = 0; i < catalog.products.length; i++)
{
    var product = catalog.products[i];
    var productName = product.name;
    for(var j = 0; j < product.versions.length; j++)
    {
        var version = product.versions[j];
    }
}
于 2013-03-07T10:27:34.327 に答える
8

myJSONObject.abcは、、などprod_1のキーを持つオブジェクトです。prod_2を使用して、オブジェクトのキーをループできますfor-in。それで:

var productName;
var productVersionArray;

for (productName in myJSONObject.abc) {
    productVersionArray = myJSONObject.abc[productName];
}

キーの順序は仕様で定義されておらず、JavaScriptエンジンごとに異なることに注意してください。それらを特定の順序で実行する場合は、それらの配列を取得し、必要な順序で並べ替えてから、その配列をループする必要があります。(ES5対応環境では、オブジェクトのキーの配列をから取得できますObject.keys(yourObject)。ただし、古いブラウザーにはシムが必要です。)

そのループ内で、標準forループを使用して配列をループできます。

for (versionIndex = 0; versionIndex < productVersionArray.length; ++versionIndex) {
    // Use `productVersionArray[versionIndex].prod_ver` here
}

これをすべてまとめた例を次に示します。

(function() {

  var myJSONObject = 
    {
    "abc":
        {
            "prod_1": 
            [
                {"prod_ver" : "prod 1 ver 1"},
                {"prod_ver" : "prod 1 ver 2"}
            ],

            "prod_2": 
            [
                {"prod_ver" : "prod 2 ver 1"},
                {"prod_ver" : "prod 2 ver 2"}
            ],
            "prod_3": 
            [
                {"prod_ver" : "prod 3 ver 1"},
                {"prod_ver" : "prod 3 ver 2"}
            ]
        }
    };

  var productName;
  var productVersionArray;
  var versionIndex;

  for (productName in myJSONObject.abc) {
      productVersionArray = myJSONObject.abc[productName];
      display(productName + " has " + productVersionArray.length + " versions listed");
      for (versionIndex = 0; versionIndex < productVersionArray.length; ++versionIndex) {
        display("* " + productVersionArray[versionIndex].prod_ver);
      }
  }

  function display(msg) {
    var p = document.createElement('p');
    p.innerHTML = String(msg);
    document.body.appendChild(p);
  }

})();

ライブコピー| ソース

于 2013-03-07T10:25:11.303 に答える
1

ES6で更新

  var { products } =
    {
        "products": [
            {
                "name": "prod 1",
                "versions": [
                    "ver 1",
                    "ver 2"
                ]
            },
            {
                "name": "prod 2",
                "versions": [
                    "ver 1",
                    "ver 2"
                ]
            },
            {
                "name": "prod 3",
                "versions": [
                    "ver 1",
                    "ver 2"
                ]
            }
        ]
    };

    let inventory = products.reduce((accumulator, currentValue) => {
        let { name, versions } = currentValue;
        accumulator[name] = versions
        return accumulator
    }, []);

    Object.entries(inventory).forEach((prod) => {
        let prodName = prod[0];
        let prodVers = prod[1].join(", ");
    });
于 2018-09-21T19:11:42.103 に答える
1
function z() {
  for (let key in myJSONObject.abc) {
    let value = myJSONObject.abc[key];
    for (let i = 0; i <= value.length; i++) {
      console.log(value[[i]]);
    }
  }
}
于 2019-12-07T18:30:39.700 に答える