0

正規化したいフラットなデータセットがあります。データセットは存在し、ソースは変更できないため、より良いデータ構造を定義することはできません。データを「正規化」して再構築することはできましたが、行数が増え始めたときにどれだけ効率的かわかりません。これが私が持っているものです。私が言ったように、よりエレガントなソリューションを探すだけで機能します...

理想的な出力は次のようになります

    {ArticleID: "ABC123", 
Status: "Scheduled", 
Articles: { 
  ArticleID: "ABC123", 
  Region: US, 
  PubTypeID: "EO", 
  PubType: "Europe Order", 
  Created: "01/01/2013", 
  Scheduled: "03/02/2013"
  },{ 
  ArticleID: "ABC234", 
  Region: US, 
  PubTypeID: "EO", 
  PubType: "Europe Order", 
  Created: "01/01/2013", 
  Scheduled: "03/02/2013"
  }
}

ここにjsFiddleへのリンクがあります

$(document).ready(function(){

var data = new Array( 
{ 
  ArticleID: "ABC123", 
  Region: 'US', 
  PubTypeID: "EO", 
  PubType: "Europe Order", 
  Created: "01/01/2013", 
  Scheduled: "03/02/2013"
},
{ 
  ArticleID: "ABC123", 
  Region: 'RU', 
  PubTypeID: "EO", 
  PubType: "Europe Order", 
  Created: "01/01/2013", 
  Scheduled: "04/02/2013"
},
{ 
  ArticleID: "ABC763", 
  Region: 'EO', 
  PubTypeID: "EO", 
  PubType: "Europe Order", 
  Created: "01/01/2013", 
  Scheduled: "03/02/2013"
},
{ 
  ArticleID: "ABC498", 
  Region: 'JP', 
  PubTypeID: "EN", 
  PubType: "Europe Order", 
  Created: "01/01/2013", 
  Scheduled: "03/02/2013"
}
);

var Articles = new Array(); 
var pID = "";
var cID = "";

$.each(data, function(i, item) {
cID = item.ArticleID;
var entries = new Array();
if(cID != pID)
{
    $.each(data, function(j, item2) {
        var entry = new Object();
        if(cID === item2.ArticleID)
        {
            entry.ArticlID = item2.ArticleID;
            entry.Region = item2.Region;
            entry.PubTypeID = item2.PubTypeID
            entries.push(entry);
        }
    });
    Articles.push({ArtilceID: cID, Entries: entries})
    pID = cID
}
});

alert(Articles.length);
alert(Articles[0].Entries.length);


});
4

1 に答える 1

0

1回の反復で十分です。groupByルックアップオブジェクトを利用する操作を使用できます。

var byId = {};
for (var i=0; i<data.length; i++)
    if (data[i].ArticleID in byId)
        byId[data[i].ArticleID].push(data[i]);
    else
        byId[data[i].ArticleID] = [data[i]];

正確に何が必要かはわかりませんが、たとえば、次のようにして、元のコードが簡単に構築できる構造を取得できます。

var Articles = [];
for (var id in byId)
     Articles.push({
        ArtilceID: id,
        Entries: $.map(byId[id], function(item) {
            return {
                ArticlID: item.ArticleID,
                Region: item.Region,
                PubTypeID: item.PubTypeID
            };
        }) // not sure why you need to clone them, though
     });
于 2013-01-22T19:29:23.307 に答える