2017-05-23 19 views
-1

私はblog.likesという配列を持っています。現在ログインしているユーザー(req.user._id)のIDが既に内部に存在するかどうかを確認したい好きな配列。もしそうであれば、配列からidを削除します。そうでなければ、配列の中にユーザIDを追加します。コードでは、私は今すぐ私は好きなときに私はそれをもう一度それを削除するようなボタンを押した場合、私は好きですが、投稿が好きで、私は別のユーザーとログインし、 1人のユーザーによって作成されたお気に入りだけでなく、すべてのお気に入りを削除することができます。文字列の配列内に文字列が既に存在するかどうかを調べる--javascript

  if (blog.likes.indexOf(req.user._id) > -1){ 
      blog.likes.shift(req.user._id); 
      blog.save(); 
      } else { 
      blog.likes.push(req.user); 
      blog.save(); 
      } 
+0

シフト配列メソッドは、値がパラメータと等しい配列要素を探して削除しません。配列から最初の要素を削除します。したがって、正しい要素ではない配列から最初の要素を削除していて、次にユーザーIDがそこに残っています。 – James

答えて

2

shift関数はユーザIDでログインへの注意を払っていない、配列から最初の要素を削除します。希望の結果を得るには、splice関数を使用してください。このようにコードを変更し :

let userIndex = blog.likes.indexOf(req.user._id); 
if (userIndex > -1) { 
    blog.likes.splice(userIndex, 1); 
} else { 
    blog.likes.push(req.user); 
} 
blog.save(); 
+0

ありがとうございました! –

+0

喜んで:) – gaganshera

0

私はコメント.shiftで述べたように()を使用する正しい方法ではありません。これを試してみてください:

var f = blog.likes.indexOf(req.user._id); 
if (f > -1) { 
    blog.likes.splice(f, 1); 
} else { 
    blog.likes.push(req.user); 
} 
blog.save(); 
関連する問題