2013-01-22 5 views
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" 
    } 
} 

Here is a link to 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); 


}); 
+0

은 귀하가 정확하게이 데이터에 액세스/처리해야하는 방법을 알려 주실 때까지 도움이 될 수 없습니다. 한 사람의 우아한 "zomg this is perfect"는 다른 사람의 "쓰레기 같은 것" –

+0

@MarcB이 경우 우리는 O (n^2) 해결책에 대해 이야기하고 있습니다. 그래서 OP가 할 수있는 말은 공정하다고 생각합니다. 확실히 큰 데이터 세트의 경우 훨씬 더 잘 수행됩니다. – Pointy

+0

당신은 정교 할 수 있습니까? O (n^2)와 OP는 무엇입니까? – user1735894

답변

0

하나 같을 것이다 것입니다 ... 더 우아한 솔루션을 찾고 작품 말했듯이 내가 무엇을 가지고 반복이 충분해야합니다. 당신은 조회 오브젝트 활용하는 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 
    }); 
+0

내 목표는 접을 수있는 영역이있는 대시 보드를 만드는 것입니다. 고유 한 ArticleID가있는 영역 머리글을 표시하고 각각의 관련 기사 아래에 표시하려고합니다. 내 데이터가 – user1735894

+0

인데 ... 기사 ID별로 그룹화 된 데이터가 필요합니다. 나머지는 잊어 버리십시오. for-in-loop를 사용하여 객체를 열거하면됩니다. – Bergi