2017-04-10 50 views
0

我有一个数组,可以在查看/查看时收集图像的统计数据。读取数组时,它会显示捕获的信息,例如用户查看的日期以及特定用户_id(由Meteor.user()._id;生成)。如下图所示显示:如何避免重复数组push()函数中的字段?

{viewedDate: "Sat Apr 08 2017 23:00:47", viewedBy: "udEnfEmy5DSBvDsSy"} 
{viewedDate: "Sat Apr 08 2017 23:01:17", viewedBy: "udEnfEmy5DSBvDsSy"}  
{viewedDate: "Sat Apr 08 2017 23:01:27", viewedBy: "udEnfEmy5DSBvDsSy"}  
{viewedDate: "Sat Apr 08 2017 23:02:37", viewedBy: "udEnfEmy5DSBvDsSy"} 

正如你会注意到,在viewedBy领域重复。如何避免viewedBy字段中的重复项?

查找下面我当前的代码:

var viewStatistics = buyList.find({_id:"kegqdvFHFoQptvJXn"}); 
    var currentUserID = Meteor.user()._id;   
    viewStatistics.forEach(function(itemName){ 

    viewStatisticsArray = [,...itemName.viewStatisticsArray]; 

    if (viewStatisticsArray.indexOf(itemName)== -1) viewStatisticsArray.push({viewedDate: Date(), viewedBy: Meteor.user()._id }); 

}); 

在一个失败的尝试,以避免进入重复为viewedBy我也曾尝试以下逻辑上使的感觉很多的代码,但未能获得预期的效果:

if (viewStatisticsArray.indexOf(itemName.viewedBy)== -1) viewStatisticsArray.push({viewedDate: Date(), viewedBy: Meteor.user()._id }); 

任何帮助非常感谢!

+0

为什么不干脆将“udEnfEmy5DSBvDsSy”保存在一个变量中,然后将'viewedBy'字段设置为变量? – Carcigenicate

回答

0

viewStatisticsArray.indexOf()== -1将不起作用,因为数组的每个元素都不相同(日期不同)。

你可以这样做:

var viewedByItem = viewStatisticsArray.filter(function(d) { 
    return d.viewedBy == itemName.viewedBy; 
}); 
if (viewedByItem.length == 0) { 
    viewStatisticsArray.push({viewedDate: Date(), viewedBy: Meteor.user()._id }); 
} 

,或者如果你仍然想使用的indexOf(),你可以做一个映射函数返回每个对象的viewedBy属性:

var viewedByPeople = viewStatisticsArray.map(function(d) { 
    return d.viewedBy; 
} 
if (viewedByPeople.indexOf(itemName.viewedBy) == -1) { 
    viewStatisticsArray.push({viewedDate: Date(), viewedBy: Meteor.user()._id }); 
}