0
{
  "company": [
    { "region": [ "Europe", "Germany" ], "productLine": "Produce" },
    { "region": [ "Europe", "France" ], "productLine": "Produce" }
    ],
    "company2": [
    { "region": [ "Europe", "Germany" ], "productLine": "Produce" },
    {  "region": [ "Americas", "USA" ], "productLine": "Produce" }
    ]
}

このjsonデータを使用して、ドイツ/フランスを子としてヨーロッパ/アメリカの値をプライマリ(一意)ノードとして持つように再構築するにはどうすればよいですか? company/company1 は France/Germany のサブ子になります。関係を正しく保ちながら配列を構築する方法を理解できないようです。つまり、ノード ツリーを逆にする必要があります。

期待される出力:

このようなツリー構造:

-Europe
   -France
      -Company
      -Company2

ツリー プラグイン用の特別な構造も必要です。

var source = [ { label: "Europe", items: [
   {label: "France", items: [
      {label: "SuperShop", items: [
            {label: "Produce"}
         ]}
      ]
   }]
}]

最終的に必要なのは、ラベルと項目の値のペアを持つオブジェクト配列です。サブオブジェクトを含むオブジェクトであるアイテム。

4

1 に答える 1

3

明らかに、なぜ新しい形式が必要なのかはわかりませんが、あまりにも複雑に思えます。調べている大きなデータセットがある場合、現在の設定では、探しているものを見つけるために新しい配列のすべての要素をトラバースする必要があるため、速度が低下します。為に ...

var inputs = {
  "company": [
    { "region": [ "Europe", "Germany" ], "productLine": "Produce" },
    { "region": [ "Europe", "France" ], "productLine": "Produce" }
    ],
    "company2": [
    { "region": [ "Europe", "Germany" ], "productLine": "Produce" },
    {  "region": [ "Americas", "USA" ], "productLine": "Produce" }
    ]
};

var converter = {};

// This new format requires a 2 step process to prevent it from being N^2
// So convert the input into a tree
//   Region
//     -> Country
//       -> Company
//         -> Array of Products
for(var company in inputs){
  for(var i = 0; i < inputs[company].length; i++){
    // Because the regions are an array of hashes it is simplest
    // to grab the value by using the previously gathered keys
    // and the key region
    var r = inputs[company][i]['region'];

    // Check if the region exists.  If not create it.
    if(!converter[r[0]]){
      converter[r[0]] = {};
    }
    // Check if the country exists.  If not create it.
    if(!converter[r[0]][r[1]]){
      converter[r[0]][r[1]] = {};
    }
    // Add the company to the array.
    if(!converter[r[0]][r[1]][company]){
      converter[r[0]][r[1]][company] = [];
    }
    converter[r[0]][r[1]][company].push(inputs[company][i]['productLine']);
  }
}

var outputs = [];

// Now walk converter and generate the desired object.
for( var region in converter){
  converted_region = {};
  converted_region["label"] = region;
  converted_region["items"] = [];
  for( var country in converter[region]){
    converted_country = {};
    converted_country["label"] = country;
    converted_country["items"] = [];
    for( var company in converter[region][country]){
      converted_company = {};
      converted_company["label"] = company;
      converted_company["items"] = [];
      for(var i = 0; i < converter[region][country][company].length; i++){
        converted_company["items"].push(converter[region][country][company][i]);
      }
      converted_country["items"].push(converted_company);
    }
    converted_region["items"].push(converted_country);
  }
  outputs.push(converted_region);
}
于 2013-04-21T18:42:22.270 に答える