计算数组中与另一个对象匹配的对象数(仅限javascript)

时间:2012-02-12 22:05:24

标签: javascript arrays count key

现在我正在做这样的事情来匹配数组中的对象:

for (var key in users)
{
if (users[key].userID==session)
{
 //do whatever
}
}

但是我需要弄清楚这次匹配的次数,如果它只匹配一次,那么我希望它能触发事件(它说“//做任何事情”)

5 个答案:

答案 0 :(得分:4)

您可以像这样使用array.filter method

users.filter(function(a){return (a.userID==session)}).length == 1;

虽然用户需要运行现代浏览器(js 1.6)或过滤方法是polyfilled。

答案 1 :(得分:2)

只需增加一个变量并在循环后检查它是否为== 1

var matched = 0;
for (var key in users) {
    if (users[key].userID==session) {
        matched++;
    }
}

if (matched == 1) {
    // do something
}

答案 2 :(得分:2)

这很快就会找到2个匹配

var count= 0;
for(var key in users){
    if(users[key].userID== session)++count;
    if(count== 2) break;
}
if(count== 1){
    //do whatever
}

答案 3 :(得分:1)

如果你因为表现而担心,你可能想要检查一下:

function isOnce(itm,arr){
    var first_match=-1;
    for(var i=0,len=arr.length;i<len;i++){
        if(arr[i]===itm){
            first_match=i;
            break;
        }
    }
    if(first_match!=-1){
        var last_match=-1;
        for(i=arr.length-1;i>first_match;i--){
            if(arr[i]===itm){
                last_match=i;
                break;
            }
        }
        if(last_match==-1){
            return true;
        }
    }
    return false;
}

当满足以下两点时,您会注意到节省:

  • 有2场或更多场比赛
  • 第一场和最后一场比赛相隔至少1个空格

换句话说,你永远不会循环第一个和最后一个匹配之间的元素。所以最好的情况是:

arr=["a", ...(thousands of items here)... ,"a"];// you only looped 2 times!

答案 4 :(得分:0)

我有一种感觉,我在你的问题中遗漏了一些东西,但是如果我理解它应该有效,并且非常有效,因为一旦找到第二个匹配,循环就会停止。

var firstMatch = null;

for (var key in users) {
  if (users[key].userID==session) {
    if (firstMatch) { // if a previous match was found unset it and break the loop
      firstMatch = null;
      break;
    } else { // else set it
      firstMatch = users[key];
    }
  }
}

if (firstMatch) {
    doSomethingTo(firstMatch); // maybe you don't need to pass in firstMatch, but it's available if you need to
}

或者以下循环与上面的循环相同,但代码少了一些

for (var key in users) {
  if (users[key].userID==session) {
    firstMatch = (firstMatch) ? null : users[key];
    if(!firstMatch) break;
  }
}