如何使用数组splice()函数删除对象中的子数组?

时间:2017-04-12 14:04:11

标签: javascript arrays meteor associative-array splice

我编写了一个成功将数组(called: "wishlistArray")插入现有代码的代码 使用数组push()函数的对象。

正如您已经猜到的那样,当用户想要将某个项目添加到他/她的愿望清单时会触发它。

为了清晰起见,在下面找到我的对象架构,表示具有用户ID的用户:" udEnfEmy5DSBvDsSy" 已经将对象添加到他/她的愿望清单"

_id: "DFhcAYAtMBviczogo"
createdDate: "04/12/2017"
expiryDate: "04/22/2017"
noOfViews: 125

   wishListArray: Array[1]
   0: Object
      wishedBy: "udEnfEmy5DSBvDsSy"

为避免在 wishlistArray 数组中插入重复项,我会检查当前用户ID是否已存在于 wishlistArray 数组中,如下代码所示:

var selectedItemIDSet = Session.get('selectedItemIDSet');
var addToWishList = buyList.find(selectedItemIDSet);
var currentUser = [Meteor.user()._id ];

var wheatherWishListedOrNot = buyList.find({ _id:selectedID, 'wishListArray.wishedBy': {$in: currentUser } } ).count();

addToWishList.forEach(function(itemName){

 var currentObjectID = itemName._id; 

        //### If wishListArrayArray array already exists in then...
        if (itemName.wishListArray) {

               var wishListArray = [,...itemName.wishListArray];

                    //### If current user hasnt wish listed item then add to Wish List (wishListArray) array
                if (wheatherWishListedOrNot == "0") { 

                        wishListArray.push({ wishedBy: Meteor.user()._id });
                        Session.set('wishListArrayToGo',wishListArray );

                        }
                else if(wheatherWishListedOrNot == "1") {
                        //### Else if WishedListed by current user, Do absolutely nothing!

                        }   
                }                                  

        var wishListArray = Session.get('wishListArrayToGo');  

        buyList.update(currentObjectID, {$set: {wishListArray: wishListArray} }); 

    });    

在解释了我是如何实现这一目标之后,我遇到了相反的问题?如何从 wishListArray 数组中删除用户?

我尝试过以下代码但没有成功。

var selectedItemIDSet = Session.get('selectedItemIDSet');
var removeFromWishList = buyList.find(selectedItemIDSet);

var currentUser = [Meteor.user()._id ];

wheatherWishListedOrNot = buyList.find({ _id:selectedID, 'wishListArray.wishedBy': {$in: currentUser } } ).count();


removeFromWishList.forEach(function(itemName){

 var currentObjectID = itemName._id; 

        //### If wishListArrayArray array already exists in then...
        if (itemName.wishListArray) {

               var wishListArray = [,...itemName.wishListArray];

                    //### If current user current user is on **WishedListArray**, then remove from **WishedListArray** array.
                if (wheatherWishListedOrNot == "1") { 

                        wishListArray.splice({ wishedBy: Meteor.user()._id });
                        Session.set('wishListArrayToGo',wishListArray );

                        }
                else if(wheatherWishListedOrNot == "0") {
                        //### Else if current user isnt on WishedListArray, Do absolutely nothing!

                        }   
                }                                  

        var wishListArray = Session.get('wishListArrayToGo');  

        buyList.update(currentObjectID, {$set: {wishListArray: wishListArray} }); 

    });     

我尝试删除的代码对我来说似乎合乎逻辑,但无法从 WishlistArray 中删除用户ID。有人可以指出我哪里出错了吗?

提前致谢!

1 个答案:

答案 0 :(得分:2)

您可以使用简单的mongo运算符实现您想要的功能。为了使它更简单,你可以使用一个字符串数组wishList(userIds)。

要插入用户:

buyList.update(currentObjectID, { $addToSet: { wishList: userId} });

addToSet只会插入userId(如果尚未插入)。

并再次将其删除:

buyList.update(currentObjectID, { $pull: { whishList: userId } });

怎么样?