Javascript 如何过滤对象数组?

Javascript 如何过滤对象数组?,javascript,Javascript,我有一个从web服务中提取的对象数组,看起来像这样 { ArticleID: "ABC123", Region: "US", PubTypeID: "EO", PubType: "Europe Order", Created: "01/01/2013", Scheduled: "03/02/2013" } ArticleID、Region和PubTypeID组成一个复合键。数据源是一个表,无法更改,但我需要获取唯一的项以显示类似于仪表板的界面。因此,显示唯

我有一个从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怎么做吗?

为了像您描述的那样将这些数据构建到一个表中,我会首先组织数据,使其与您想要做的匹配。因此,我将迭代返回的数据并将其转换为:

{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都具有相同的状态,因此在重构对象时可以忽略这一点,并在构建表时插入


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

您可以使用
Array.prototype.filter
,对所有条目进行排序,因为您知道所有的文章ID(如果不知道,则必须迭代输入并收集它们)

var输入=[{
ArticleID:“ABC123”,
地区:“美国”
},{ 
ArticleID:“ABC456”,
地区:“美国”
}];
变量区域=[“ABC123”、“ABC456”];
var条款=[];
弗雷赫(
功能(reg,i){
articles[i]=input.filter(函数(el){return el.ArticleID==reg});
}
);
控制台日志(区域);

//区域[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分组的


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

那么在fiddle操作系统中,键是字段名还是字段中的值?顺便说一句谢谢对不起,你介意用Os吗?。我不明白这个问题。你能再解释一下你有什么问题吗?:)对不起,我在手机上打字。。。我的意思是,在您发布的SQL中,键是字段名还是字段值?。例如,它是数据[“ArticleID”]还是数据[“ABC123”]?在我们正在生成的新数组中,每组对象的键是对象共享的值,例如[“ABC123”]。我们使用键(articleID)的地方就是定义X变量的地方。但是我们在for循环中使用“key”作为变量,让我们选择每个对象,这可能有点混乱。我做了这种调试,所以你可以在控制台上读取这些变量和键的值。最后,我还加入了一个在控制台中打印渴望的结果,比如说一种使用newArray的方法。
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)