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"
}

如果将用户名“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;
    }
}

您也可以循环对象集合(使用for..in,请参阅mVChr 的答案),但在这种情况下,您似乎真的应该使用数组。

于 2013-03-07T21:55:38.873 回答
2

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

Object.values(collectionOrObject);

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Object/values

当您使用本机 javascript dom 选择器时,这尤其会派上用场,例如:

document.getElementsByClassName('someClass');

返回一个集合

于 2019-03-27T12:40:10.853 回答
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;
 }

这里唯一的“陷阱”是您需要在这里有一个数组而不是一个对象,如果您将集合变量修改为数组没有问题,在我看来,这种函数式方法将是最优雅的方法。

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

于 2013-03-07T22:00:49.680 回答