现在我正在做类似如下的事情来匹配数组中的对象:
for (var key in users)
{
if (users[key].userID==session)
{
//do whatever
}
}
但我需要弄清楚这个匹配项出现的次数,如果只匹配一次,那么我希望它触发事件(在“//do whatever”处)
现在我正在做类似如下的事情来匹配数组中的对象:
for (var key in users)
{
if (users[key].userID==session)
{
//do whatever
}
}
但我需要弄清楚这个匹配项出现的次数,如果只匹配一次,那么我希望它触发事件(在“//do whatever”处)
users.filter(function(a){return (a.userID==session)}).length == 1;
这个操作在找到2个匹配项后立即停止搜索。
var count= 0;
for(var key in users){
if(users[key].userID== session)++count;
if(count== 2) break;
}
if(count== 1){
//do whatever
}
只需增加一个变量并在循环后检查它是否等于1
。
var matched = 0;
for (var key in users) {
if (users[key].userID==session) {
matched++;
}
}
if (matched == 1) {
// do something
}
Object.keys()
生成一个数组,然后用for
循环迭代。但它只是稍微快了一点点,并且不支持旧版浏览器。除非你的对象有像10万个成员那么多,否则效率实际上不应该是一个巨大的问题。 - Kevin Ennis如果你担心性能问题,你可能想要查看这个:
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;
}
当满足以下两个条件时,您将会注意到节省:
换句话说,您永远不需要循环处理第一个和最后一个匹配项之间的元素。因此,最理想的情况是:
arr=["a", ...(thousands of items here)... ,"a"];// you only looped 2 times!
if
语句,你需要等待循环完成计数。 - ajax333221我有一种感觉,可能在你的问题中漏掉了什么,但如果我理解正确,这应该可以工作,并且非常高效,因为循环会在找到第二个匹配项后立即停止。
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;
}
}