JavaScript遍历数组仅保留单索引值时pop()报错如何解决
问题根因
报错 未捕获类型错误:available.pop 不是一个函数 的核心原因有两个:
- 你对数据结构的判断错误:你以为
availables是二维数组,但从你贴的打印结果看,它是对象构成的数组,每个元素是{id: "", date: "", isAvailable: "", price: ""}格式的普通键值对对象,不是数组,自然没有数组专属的.pop()方法。 .pop()方法本身用法错误:数组的.pop()方法不接收任何参数,作用固定是删除数组的最后一个元素并返回该元素,根本不支持传入索引指定删除位置,你写.pop(2)本身就是不符合API设计的用法。
修正代码
你提到需求是“移除其余字段,仅保留单个索引/属性对应的值”,结合easepicker预订日历的使用场景,你大概率是需要提取可预订的日期值,直接用Array.map()做结构转换即可,不需要循环做删除操作:
$.ajax({ url : 'get_data.php', // 从接口拉取存在数据库的第三方预订数据 type : 'GET', success : checkAvail, }); function checkAvail(response) { // 移除冗余的重复变量声明,原代码先给全局results赋值又声明局部results是不规范写法 const results = jQuery.parseJSON(response); const availables = results.filter(a => a.isAvailable === '1'); console.log(availables); // 提取需要的字段,比如如果只需要给日历传日期字符串,直接取date属性即可 const availableDateList = availables.map(item => item.date); // 如果需要保留对象结构、仅删掉多余属性,就返回重组后的对象即可,比如只留日期和价格 // const availableDateList = availables.map(item => ({ // date: item.date, // price: item.price // })) console.table(availableDateList); // 后续把处理好的availableDateList传入easepicker做可选日期配置即可 }
额外注意事项
- 声明变量一定要加
let/const,原代码里results、availables都没加变量声明关键字,会直接挂载到全局作用域,很容易引发变量污染导致的异常 - 操作数据前先确认数据类型:判断一个值是不是数组可以用
Array.isArray(待检测值),不要靠主观预判结构 - 如果真的需要删除数组指定位置的元素,要用
.splice(起始索引, 删除元素个数),比如删除数组索引为2的元素写法是arr.splice(2, 1),注意这个方法同样只对数组生效,不能用在普通对象上
内容的提问来源于stack exchange,提问作者avia
相关产品推荐
相关产品推荐

