如何判断jQuery数组含特定值?data_d数组时间存在性检测问题
判断数组中是否存在特定时间值的解决方案
嘿,我来帮你搞定这个问题!你之前用data_d.indexOf(time)一直返回false的核心原因很简单:你的data_d数组里的每个元素都是数组配对(比如[timestamp, v.kreditbetrag]或者[time, 0]),而indexOf是严格匹配整个数组元素的——你拿单个time值去搜索,当然找不到完全匹配的元素,所以alert才会一直显示false。
下面给你几种实用的解决方法,结合你的代码场景来写:
方法1:用jQuery的$.grep()过滤数组
这是jQuery里专门用来筛选数组的方法,很适合你的场景:
$.each(date_range, function(kr, time) { alert('time' + '=>' + time); // 判断time是否存在于data_d的第一个元素位置 var isExist = $.grep(data_d, function(item) { // item[0]就是数组配对里的时间值,和当前time做严格匹配 return item[0] === time; }).length > 0; alert(isExist); // 现在会正确显示true/false // 你的原有逻辑 if (time == timestamp) { data_d.push([timestamp, v.kreditbetrag]); } else { data_d.push([time, 0]); } });
方法2:用原生JS的some()方法(更简洁)
如果你的环境支持ES6+,原生的some()方法会更高效,它只要找到第一个匹配的元素就会停止遍历:
$.each(date_range, function(kr, time) { alert('time' + '=>' + time); var isExist = data_d.some(function(item) { return item[0] === time; }); alert(isExist); // 原有逻辑不变 if (time == timestamp) { data_d.push([timestamp, v.kreditbetrag]); } else { data_d.push([time, 0]); } });
方法3:针对你给出的对象结构的扩展
你还提到了一个对象示例obj = {0:{kreditbetrag:1300,datum:'2018-03-30'},1:{kreditbetrag:2600,datum:'2018-03-31'}},如果要判断某个time是否存在于这个对象的datum属性里,可以这样写:
// 先把对象的值转成数组,再用some判断 var isExist = Object.values(obj).some(function(item) { return item.datum === time; }); alert(isExist);
小提醒
如果你的需求是避免向data_d中重复添加相同time的元素,可以在push前加上判断,比如:
if (time == timestamp) { // 先判断是否已存在,不存在再添加 if (!isExist) { data_d.push([timestamp, v.kreditbetrag]); } } else { if (!isExist) { data_d.push([time, 0]); } }
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

