2013-11-02 18 views
19

に存在するかどうかを確認します。マングースはのObjectIdは、例えばモデルで次の配列

AboutModel == { 
    name: String, 
} 

User.findOne({name: 'Alpha'}, function(error, user){ 
    About.find({}, function(error, abouts){ // consider abouts are all unique in this case 
     var doStuff = function(index){ 
      if (!(about.id in user.friends)){ 
       user.friends.push(about.id); 
       about.save(); 
      } 
      if (index + 1 < abouts.length){ 
       doStuff(index + 1) 
      } 
     } 
     doStuff(0) // recursively... 
    }) 
}) 

この場合、 'about.id in user.friends'という条件は常に偽と思われます。どうやって?これはObjectIdのタイプや保存方法と関係していますか?

注:はSchema.ObjectIdの略です。それが問題なのかどうかはわかりません。

答えて

33

about.idは、オブジェクトIDの文字列表現であるとuser.friendsはのObjectIDの配列である場合は、あなたがチェックすることができますabout.idを使用して、配列内にある場合Array#some

var isInArray = user.friends.some(function (friend) { 
    return friend.equals(about.id); 
}); 

some呼び出しがを呼び出し、user.friends配列を反復処理しますと一致するかどうかを確認し、一致するとすぐに停止します。一致するものが見つかるとtrue、それ以外の場合はfalseを返します。

indexOfのような単純なものは、参照ではなく値でObjectIDを比較したいからです。

+0

これは基本的に 'forEach'で' == 'と同じですか? – p0lAris

+0

TypeError:Object 5274958d4ddfd6341858b2f7には 'equals'メソッドがありません。 – p0lAris

+0

配列に値が設定されている場合はどうなりますか? –

-3

これは、Node.js/Mongooseの質問ではなく、javascriptの質問であると信じています。実際には現在の方法に属しません。

また、about.id in user.friendsの問題は、about.idが指すオブジェクトとuser.friendsのオブジェクトが異なることです。私はinがオブジェクトの同等性をチェックすると信じています。とにかく

、答えは要素が配列に存在する場所を確認するために、スタックオーバーフローで提供されています -

user.friends.indexOf(about.id) > -1 
+1

は、彼らが質問をなぜ –

+0

* I *がこの質問をしたものだった、たObjectIdでは動作しません。 – p0lAris

+0

ああ、謝罪する! –

3

私はLO-ダッシュを使用し、そのような何かを:

var id_to_found = '...'; 
var index = _.find(array, function(ch) { 
    return ch == id_to_found ; 
}); 
if (index!=undefined) { 
    // CHILD_ALREADY_EXISTS 
} else { 
    // OK NOT PRESENTS 
} 
+0

http://lodash.com/私はこれを好きであり、アンダースコアではありません:) – gperreymond

+0

ああ、申し訳ありません。私はそれが翻訳の問題か何かだと思った。 – evandentremont