如何避免重复数组 push() 函数中的字段?

How do avoid duplicating a field in an array push() function?

我有一个数组,可以在 viewed/viewed 时收集图像的统计信息。读取数组时,它会显示捕获的信息,例如用户查看的日期和特定用户的 _id(由 Meteor.user()._id; 生成)。如下图所示:

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

非常感谢任何帮助!

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(),您可以为每个对象的 return viewedBy 属性 创建一个映射函数:

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