从对象数组中删除一个元素

Removing an element from an array of Object

我正在使用 Meteor 构建一个实时通知系统,但由于我以前从未这样做过,所以我肯定会通过欺骗来获得有用的东西。

我有一个 <ul> 通知列表。我定义了一个单击每个 <li> 包含的 <a class="notif-link"> 的事件。

我的通知有 ID、类型和其他一些我们不关心的东西。

notifications:
    [
         {id: 0, type: 0, img: null, link: "/profile"},
         {id: 1, type: 1, img: null, link: "/profile"},
         {id: 2, type: 2, img: null, link: "/profile"},
         {id: 3, type: 3, img: null, link: "/profile"},
    ]

...

Template.navigation.events({
       "click .notif-link": function(e, tmpl){
           console.log(EJSON.stringify(this)); // print the verbosed notification object as shown above
           var index = Meteor.user().profile.notifications.indexOf({id: this.id});
           console.log(index); // always == -1
           newNotifArray = Meteor.user().profile.notifications.splice(index, 1);
           Meteor.users.update({_id: Meteor.userId()}, {$set: {'profile.notifications': newNotifArray}});
       }
   });

notification.id 设置为 <a> #id,这应该允许我识别数组中的通知并在单击 link 时将其删除。

问题是 notification.indexOf({id : this.id}) 总是 return 我 -1。 我想问题是我不知道如何在对象数组上正常工作。

有人可以向我解释如何处理吗?

谢谢。

问题是您试图找到您创建的新对象的索引:{id: this.id},在您定义的通知对象数组中,显然不包括它。

Array.IndexOf 当给定一个要搜索的对象时,将尝试在数组中找到相同的对象(内存中的指针),因此除非您有实际的对象,否则您不能真正使用它。 例如:notifications.indexOf({id: 0, type: 0, img: null, link: "/profile"}),也将 return -1 因为它是一个不同的对象,即使具有相同的值。

我不熟悉 Meteor,但是在这种情况下有一些库可以帮助你,例如下划线对数组和列表助手很有帮助。 对于这种情况,您可以使用下划线的 findWhere 方法,如下所示:

_.notifications.findWhere({id: this.id})

这将 return 数组中与您指定的属性匹配的实际对象,然后您可以使用实际对象 Array.indexOf 获取数组中对象的索引。

我敢肯定还有很多其他方法和库可以执行此操作,具体取决于您已经在使用的内容。 以下是一些不使用下划线的其他解决方案的链接:

使用纯 Javascript 映射 - indexOf method in an object array?

使用 JQuery grep - Find object by id in an array of JavaScript objects

干杯。

您正在寻找一个名为:{id: 1} 的对象,但您的通知条目较大。它们还包含其他字段(不仅仅是 ID 字段)。您将标准 JavaScript 比较与 MongoDB 查询混淆了。

看看MongoDBs $pull操作。类似于:

Meteor.users.update({_id: Meteor.userId}, { $pull: {
    'profile.notifications': { id: this.id },
}});

(我没有测试过这段代码,不完全确定 id: this.id 查询..)

将数据加载到内存中,在那里修改它然后写回它可能看起来很直观(我一开始做了同样的事情^^),但直接在数据库上操作是 a) 更高效 b) 更多优雅。