在此代码中,我想从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'未定义的
代码有问题吗?
感谢您的帮助。
答案 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 + "^")
})