1

我有一组从 Web 服务中提取的对象,看起来像这样。

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

ArticleID、Region 和 PubTypeID 组成一个复合键。数据源是一个表,无法更改,但我需要获取唯一项以显示类似界面的仪表板。所以显示唯一的 ArticleID,但将文章分组在它们之下。界面应该看起来像这样。

ArticleID      Status
----------------------
ABC123          Scheduled
    Region:US       Scheduled: 02/02/2013
    Region:JP       Scheduled: 05/02/2013
    Region:OE       Scheduled: 03/02/2013
    Region:EU       Scheduled: 04/02/2013
ABC456          Ready to Schedule          
    Region:US       
    Region:US       
    Region:US       
ABC789          Sent
    Region:EU       Sent On: 01/02/2013
    Region:EU       Sent On: 01/02/2013
    Region:EU       Sent On: 01/02/2013
    Region:EU       Sent On: 01/02/2013

状态由日期决定。我也很困惑,如果一篇文章下的一个项目有日期而一个没有,状态会是什么?

如果数据被规范化,我在这里不会有任何问题,因为我可以进行多项选择并构建输出,但我只有一个平面结果集,所以需要在 Javascript 中进行“选择”。

有人可以帮助我如何在Javascript中做到这一点吗?

4

3 回答 3

0

您可以使用Array.prototype.filter, 对所有条目进行排序,因为您知道所有文章 ID(如果不知道,您将不得不遍历输入并收集它们)。

var input = [{ 
  ArticleID: "ABC123", 
  Region: "US"
},{ 
  ArticleID: "ABC456", 
  Region: "US"
}];

var regions = ["ABC123","ABC456"];

var articles = [];
regions.forEach(
    function(reg,i){
        articles[i] = input.filter( function(el){ return el.ArticleID == reg} );
    }
);

console.log(regions);
//regions[0] <= array with all articles with regionID "ABC123"
//regions[1] <=                   - " -               "ABC456"

现在articles包含一个数组,其中包含按 ArticleID 排序的所有文章。

请注意,这是 IE9+ 代码,为了使其在 IE8 及以下版本中工作,您需要一个 shim filterforEach您可以在相应的 MDN-Articles 中找到它。

于 2013-01-21T15:42:43.430 回答
0

我认为您需要重新排列按 ArticleID 排序的数据。并假设您将有很多文章。像这样的迭代可以完成重新安排的任务。然后,您可以轻松地遍历打印有用信息的新对象

var x
var y = 0;
var newArray = new Array();
for(key in data){
   x = data[key].articleID; //The value of the key you want to use (ArticleID)
   newArray[x] = newArray[x] || []
   newArray[x][y] = data[key];
   y++
}
console.log(newArray)

在这里你有一个小提琴。查看生成的对象(使用 chrome 或其他控制台),您将看到数据现在如何按 ArticleID 分组;

编辑:我已经用更干净的版本替换了代码。

于 2013-01-21T16:13:59.270 回答
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"
  }
}

然后根据这个结构建表。您需要在函数中进行一些计算以确定状态。我对这一点的理解不足以给你一个具体的答案,但看起来所有常见的文章 ID 都具有相同的状态,因此在重组对象时可以忽略这一点,并在构建表时插入。

如果您对服务器端代码有任何控制权,最好在将其传递给客户端之前进行此对象重组工作。

于 2013-01-21T15:38:56.017 回答