jQuery.inArray()始终返回-1问题排查:移除不在ID数组中的元素
解决jQuery.inArray()始终返回-1的问题
嘿,我来帮你搞定这个头疼的问题!你遇到的$.inArray()一直返回-1,大概率是类型不匹配或者获取属性值的方式不对导致的,咱们一步步来排查和解决:
最常见的原因:类型不匹配
$.inArray()会严格匹配值和类型(和===的逻辑一致)。举两个典型场景:
- 如果你的ID数组是
[1, 24](数字类型),但按钮的data-functionID是字符串"j1_1"、"j1_24",那肯定匹配不上; - 要是你用
$(this).data("functionID")获取值,jQuery会自动转换类型:比如属性值是纯数字"24"时,.data()会返回数字24,而如果你的数组里存的是字符串"24",这时候$.inArray()就会返回-1。
快速排查小技巧
先在遍历代码里加几个日志,看看值和类型是否一致,一眼就能找到问题:
var allowedIDs = ["j1_1", "j1_24"]; // 你的ID数组 $("[data-functionID]").each(function() { var funcID_attr = $(this).attr("data-functionID"); var funcID_data = $(this).data("functionID"); console.log("attr获取的值/类型:", funcID_attr, typeof funcID_attr); console.log("data获取的值/类型:", funcID_data, typeof funcID_data); console.log("数组第一个元素/类型:", allowedIDs[0], typeof allowedIDs[0]); console.log("inArray结果(用attr):", $.inArray(funcID_attr, allowedIDs)); });
正确的实现代码
方法一:用.attr()获取原始字符串(推荐)
直接用.attr("data-functionID")获取属性的原始字符串,避免自动类型转换的坑,再加上trim()处理可能的空格:
var allowedIDs = ["j1_1", "j1_24"]; $("[data-functionID]").each(function() { var $btn = $(this); var funcID = $btn.attr("data-functionID").trim(); if ($.inArray(funcID, allowedIDs) === -1) { $btn.remove(); } });
方法二:更简洁的.filter()写法
用filter()筛选出不需要保留的元素,再一次性移除,代码更优雅:
var allowedIDs = ["j1_1", "j1_24"]; $("[data-functionID]") .filter(function() { var funcID = $(this).attr("data-functionID").trim(); return $.inArray(funcID, allowedIDs) === -1; }) .remove();
额外注意点
- 检查数组里的ID和
data-functionID是否完全一致:有没有多余的空格、大小写差异(比如数组里是"J1_1",属性值是"j1_1"); - 如果你的ID是纯数字,要么统一用字符串类型(数组存
"24",用.attr()获取),要么统一转成数字(数组存24,用.data()获取)。
内容的提问来源于stack exchange,提问作者KingleyMosso
相关产品推荐
相关产品推荐

