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

时间:2017-01-27 14:09:31

标签: 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);
    }
});

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

  

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

代码有问题吗?

感谢您的帮助。

2 个答案:

答案 0 :(得分: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);




...或者,如果在原地修改阵列而不是创建新阵列非常重要,请使用无聊的for循环as Andreas points out循环向后通过数组,所以当你删除东西时并不重要:



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);




答案 1 :(得分:1)

首先,您不需要为此使用jQuery。其次,改变你正在操作的数组并不是一个好主意。如果您尝试从阵列中删除元素,请使用过滤器。过滤器具有以下签名:

someArray.filter(function(item, index, array) {
  // return a value that is truthy to keep an item or falsey to remove it
})

过滤器返回一个新数组,其中只包含与您想要的值匹配的值。这意味着你不会弄乱你原来的阵列,这无论如何都是个好主意。在你的情况下,它看起来像这样:

var filteredProducst = cart_products.filter(function(item) {
  return item.indexOf(product + "^")
})