Javascript TypeError:无法读取undefined的属性'indexOf'

Ali*_*ari 5 javascript jquery

在这段代码中,我想从cart_products数组中删除一个元素.

var cart_products = ["17^1", "19^1", "18^1"];
var product = 17;

$.each(cart_products,function(key, item) {
    if(item.indexOf(product+"^") !== -1){
        cart_products.splice(key, 1);
    }
});
Run Code Online (Sandbox Code Playgroud)

但我在Google Chrome控制台中收到此错误:

未捕获的TypeError:无法读取未定义的属性'indexOf'

代码有问题吗?

谢谢你的帮助.

T.J*_*der 15

问题是你正在修改数组,而jQuery $.each正在循环它,所以当它到达结尾时,以前在索引2处的条目不再存在.(我承认我有点惊讶的$.each表现,但我$.each至少五年没用过,所以...)

如果目标是从数组中删除匹配项,则更好的选择是filter:

var cart_products = ["17^1", "19^1", "18^1"];
var product = 17;

cart_products = cart_products.filter(function(item) {
    return item.indexOf(product+"^") === -1;
});
console.log(cart_products);
Run Code Online (Sandbox Code Playgroud)

...或者如果重要的是就地修改数组而不是创建一个新的数组使用一个无聊的for循环,因为Andreas指出在数组中向后循环,所以当你删除东西时无所谓:

var cart_products = ["17^1", "19^1", "18^1"];
var product = 17;

var target = product + "^";
for (var index = cart_products.length - 1; index >= 0; --index) {
  if (cart_products[index].indexOf(target) !== -1) {
    cart_products.splice(index, 1);
  }
}
console.log(cart_products);
Run Code Online (Sandbox Code Playgroud)