8

コレクションと呼ばれるオブジェクトがあり、justin がこのコレクションの一部であるかどうかをテストしたいと考えています。

collection = { 0:{screen_name:"justin"},1:{screen_name:"barry"}}

ユーザーがコレクションの一部であるかどうかを確認するために、 という関数に名前を渡す最も効率的な方法を見つけようとしてpresent_user(user)いますが、ちょっと困惑しています。

したがって、私のコレクションはオブジェクト 0、1、n+1 で構成されています。このコレクションを反復しようとしています。これまでのところ、[0] のみをテストしています

function present_user(user) {
  collection[0]["screen_name"] == user -> return true in the case of "justin"
}

このコレクションのすべての値を反復処理し、user_name "justin" が関数に渡された場合に true を返すにはどうすればよいですか?

4

5 に答える 5

16

コレクションは配列ではなくオブジェクトであるため、これを行う方法は次のとおりです。

var present_user = function(user){
    for (var k in collection) {
        if (collection[k]['screen_name'] == user) return true;
    }
    return false;
};
于 2013-03-07T21:56:38.217 に答える
7

外部オブジェクト キーがすべて数字の場合は、代わりに配列を使用する必要があります。

var collection = [{screen_name:"justin"}, {screen_name:"barry"}];

次に、次のように繰り返します。

function present_user(user) {
    for(var i=0; i < collection.length; i++) {
        if(collection[i].screen_name === user) return true;
    }
}

オブジェクト コレクションをループすることもできます (を使用して、 mVChr の回答for..inを参照してください)。ただし、この場合、実際には配列を使用する必要があるようです。

于 2013-03-07T21:55:38.873 に答える
0

コレクション内のオブジェクトの数が事前にわかっている場合は、lengthプロパティを追加して使用できます

Array.prototype.some.call(collection, function (elem) {
    return elem.screen_name = 'justin';
});

理想的collectionには、最初は配列であるため、 を使用できますがcollection.some、それが不可能な場合があることは理解しています。

その場合、事前に長さを知る方法がない場合は、手動で反復する必要があります。ごめん。

var exists = false, i;
for (i in collection) {
    if (collection.hasOwnProperty(i)) {
        /* may also want to check `screen_name` property existence
        if (collection[i].screen_name == 'justin') {
            exists = true;
            break;
        }
    }
}
于 2013-03-07T21:59:23.033 に答える
0
 function any(user) {
    return collection.filter(function (item) { return item == user }).length > 0;
 }

ここでの唯一の「落とし穴」は、オブジェクトではなく配列が必要なことです。コレクション変数を配列に変更しても問題がなければ、この機能的なアプローチが最も洗練されたものになると思います。

ただし、考慮すべきもう1つのことは、このコードは最初の一致を見つけた瞬間に停止せず、代わりに配列内のすべてのアイテムをテストするため、配列が大きくない場合にのみ使用することをお勧めします.

于 2013-03-07T22:00:49.680 に答える