【问题标题】:How do avoid duplicating a field in an array push() function?如何避免在数组 push() 函数中重复字段?
【发布时间】:2017-04-11 05:29:50
【问题描述】:

我有一个数组,用于在查看/查看时收集图像的统计信息。读取数组时,它会显示捕获的信息,例如用户查看的日期,以及特定用户的_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 });  

非常感谢任何帮助!

【问题讨论】:

  • 为什么不直接将“udEnfEmy5DSBvDsSy”保存在变量中,然后将viewedBy字段设置为变量?

标签: javascript arrays meteor push


【解决方案1】:

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(),你可以创建一个 map 函数来返回每个对象的viewedBy属性:

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

【讨论】:

    猜你喜欢
    • 2022-11-10
    • 2018-08-05
    • 2016-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-12
    相关资源
    最近更新 更多