2015-09-07 192 views
0

我有这个包含SubmitKey的json文件。jQuery:遍历json中的所有元素

[ 
    { 
    SubmitKey: "20150907-11-34-08-445" 
    }, 
    { 
    SubmitKey: "20150907-12-23-34-263" 
    } 
] 

然后我使用jQuery调用JSON成阵列,然后检查是否“的KeyID”是阵列中与否,使用此代码:

var KeyID = '20150907-12-23-34-263'; 
jQ.getJSON("data/submit.php", function (myArray){ 
    jQ(myArray).each(function() { 
      if (this.SubmitKey == KeyID) { 
         alert('I found it'); 
      } 
      else { 
       alert('its not in there'); 
      } 
    }); 

}); 

的想法是通过循环该数组并检查值是否存在,并返回警告是或否。问题是,它显示每个对象的警报消息,我只想显示它是否在整个数组中。

我该如何做到这一点?

回答

1

作为一种替代的解决方案,可以使用Array.prototype.some(),其中:

返回true,如果该数组中的至少一种元素满足提供的测试功能。

你的测试功能,会是这个样子:

function compareKeyId(element, index) { 
    return element.SubmitKey == KeyID; 
} 

然后你会使用它像这样:

jQ.getJSON("data/submit.php", function (myArray){ 
    if(myArray.some(compareKeyId)) { 
     alert('Found.'); 
    } 
    else { 
     alert('Not found.'); 
    } 
}); 

注:由于近链接MDN页面底部的解释,Internet Explorer仅支持从版本9开始的some函数。如果您需要支持下面的IE版本,那么除非您使用建议的polyfill,否则这将不是一个选项。

+0

工作就像一个魅力。谢谢安东尼。是的,在我的应用程序中,我们不支持9以下的IE,所以我们应该没问题。再次感谢。 –

0

如果我正确地理解你的问题,这应该工作:

var KeyID = '20150907-12-23-34-263'; 
jQ.getJSON("data/submit.php", function (myArray){ 
var allOk = true; 
jQ(myArray).each(function() { 
    if (this.SubmitKey != KeyID) { 
     allOk = false; 
     break; // If any one element is different, we break the loop 
    } 
}); 
if (allOk) alert('I found It'); 

我希望它能帮助。

});

0

您得到每个对象警报的原因是因为您的else语句块中有alert语句。

删除其他部分,如果您的myArray中找不到keyID,您将无法获得任何alert

如果你想第一次扫描整个阵列,并检查是否存在KeyID,那么你可以通过设置一个变量为某个值,然后一旦循环结束,验证该变量的值,然后显示警报。

var KeyID = '20150907-12-23-34-263'; 
jQ.getJSON("data/submit.php", function (myArray){ 
    var isPresent = false; 
    jQ(myArray).each(function() { 
     if (this.SubmitKey == KeyID) { 
      isPresent = true; 
      break; 
     } 
    }); 
    if(isPresent){ 
     alert('I found it`); 
    } 
});