如何过滤对象数组?

时间:2013-01-21 15:16:31

标签: javascript

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

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

ArticleID,Region& PubTypeID组成一个复合键。数据源是一个表,无法更改,但我需要获取Unique项以显示类似界面的仪表板。因此,显示唯一的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中执行此操作吗?

3 个答案:

答案 0 :(得分: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都具有相同的状态,因此在重构对象时可以忽略这些,并在构建表时插入。

如果您对服务器端代码有任何控制权,那么在将此对象重组工作传递给客户端之前,这样做会好得多。

答案 1 :(得分: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及更低版本中运行,您需要一个垫片filterforEach,您可以在相应的MDN-Articles上找到它。

答案 2 :(得分: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)

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

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