从对象数组中删除一个元素
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) 更多优雅。
我正在使用 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) 更多优雅。