迭代javascript中的对象集合,并从该函数返回true

迭代javascript中的对象集合,并从该函数返回true,javascript,arrays,loops,Javascript,Arrays,Loops,我有一个名为collection的对象,我想测试一下justin是否是这个集合的一部分 collection = { 0:{screen_name:"justin"},1:{screen_name:"barry"}} 我试图找到最有效的方法,将名称传递给名为present\u user(user)的函数,以查看用户是否是集合的一部分,我有点困惑 因此,我的集合由对象0、1、n+1组成。我正在尝试遍历这个集合。到目前为止,我只测试了[0] function present_user(user)

我有一个名为collection的对象,我想测试一下justin是否是这个集合的一部分

collection = { 0:{screen_name:"justin"},1:{screen_name:"barry"}}
我试图找到最有效的方法,将名称传递给名为
present\u user(user)
的函数,以查看用户是否是集合的一部分,我有点困惑

因此,我的集合由对象0、1、n+1组成。我正在尝试遍历这个集合。到目前为止,我只测试了[0]

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

如果用户名“justin”被传递到函数中,我如何迭代该集合的所有值并返回true?

如果外部对象键都是数字,则应该使用数组:

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;
    }
}
函数当前用户(用户){
对于(变量i=0;i

您也可以循环对象集合(在
中使用“
for…”,请参见),但在这种情况下,您似乎真的应该使用数组。

您的集合是一个对象而不是数组,因此这是一种方法:

var present_user = function(user){
    for (var k in collection) {
        if (collection[k]['screen_name'] == user) return true;
    }
    return false;
};

如果您提前知道集合中有多少对象,则可以使用add a
length
属性并使用

Array.prototype.some.call(collection, function (elem) {
    return elem.screen_name = 'justin';
});
理想情况下,
collection
最初应该是一个数组,这样您就可以使用
collection了

如果在这种情况下无法提前知道长度,则必须手动迭代。对不起

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;
        }
    }
}
这里唯一的“问题”是这里需要一个数组,而不是一个对象,如果将集合变量修改为数组没有问题,在我看来,这种函数方法将是最优雅的方法


不过,需要考虑的另一件事是,此代码不会在找到第一个匹配项时停止,而是会测试数组中的所有项,因此我建议仅在数组不大时使用它。

您还可以将集合或对象转换为数组,以便使用数组方法进行迭代:

Object.values(collectionOrObject);

当您使用本机javascript dom选择器(如:

document.getElementsByClassName('someClass');

返回一个集合

如果您呈现的是顺序数据,我可以问一下为什么您的集合是一个对象而不是一个数组吗?@JZ。如果我错了,请原谅,但看起来你有一堆东西。当我想要达到这种效果时,我通常会有一个对象(在其他属性中,如果需要的话)包含一个对象数组。然后我只是循环索引。缓存collection.length以节省.000001毫秒!要保存.000001ms:
for(var i=0,len=collection.length;i
不需要缓存集合的长度。但是,重要的是不要使用==,假设“用户”为“0”且集合为[i]。屏幕名称为false或未定义?==非常unreliable@BenjaminGruenbaum公平地说===在本例中,是经过编辑的。而且,为了记录我们正在讨论的内容,缓存在实时集合(如节点列表)上很重要,但在这里它不是(因为您只保存属性查找)。这看起来是对的。请添加hasOwnProperty检查,否则此答案是错误的。此外,请鼓励更好的行为。另外,请尝试并避免==你能用提供的数据OP证明没有hasOwnProperty是错误的吗?我不喜欢鼓励盲目地在每个for..in循环中添加一个
hasOwnProperty
。你必须知道你在做什么。同样的道理也适用于==
document.getElementsByClassName('someClass');