【问题标题】:Most efficient way to Normalized an existing dataset in javascript在 javascript 中规范化现有数据集的最有效方法
【发布时间】:2013-01-06 02:23:59
【问题描述】:

我有一个想要标准化的平面数据集。数据集是存在的,源是不可更改的,因此定义更好的数据结构不是一种选择。我已经设法“规范化”并重组数据,但我不确定当行数开始增长时它的效率如何?这就是我所拥有的,就像我说的那样,它只是在寻找更优雅的解决方案......

这是理想输出的样子

    {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);


});

【问题讨论】:

  • 在您确切告诉我们您需要如何访问/处理这些数据之前,我们无能为力。一个人优雅的“zomg 这是完美的”是另一个人的“一堆废话”
  • @MarcB 在这种情况下,我们谈论的是 O(n^2) 解决方案,所以我认为可以公平地说 OP 肯定可以做得更好,特别是对于大型数据集。跨度>
  • 您能详细说明一下吗?什么是 O(n^2) 和 OP?

标签: javascript arrays sorting normalize


【解决方案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
     });

【讨论】:

  • 我的目标是创建一个带有可折叠区域的仪表板。我想显示一个具有唯一 ArticleID 的区域负责人,然后在每个相关文章下显示。我的数据方式
  • ...因此您需要按文章 ID 分组的数据。那就是顶部的六行代码,其余的忘记了。只需使用 for-in-loop 枚举对象
猜你喜欢
  • 2021-09-05
  • 2011-04-30
  • 2011-04-05
  • 2011-06-07
  • 1970-01-01
  • 1970-01-01
  • 2014-12-31
  • 2010-11-09
  • 2021-03-09
相关资源
最近更新 更多