tengo una matriz Quiero borrar el precio cuando sea = 0
¿Por qué cuando quiero eliminar la matriz cuyo precio es 0 no elimina toda la matriz?
¿Dónde está el problema?
var products = [{ specs: "name", shopLink: "linamazon", shopLogoUrl: "icon Store/Amazon22.png", price: 0, priceUpdate: "Amazon.com", storeName: "Amazon" }, { specs: "name", shopLink: "linknewegg", shopLogoUrl: "icon Store/NewEgg.png", price: 0, priceUpdate: "NewEgg.com", storeName: "NewEgg" }, { specs: "name", shopLink: "linknoon", shopLogoUrl: "icon Store/noon-logo2.png", price: 0, priceUpdate: "icon Store/Noon.com", storeName: "Noon" }, { specs: "name", shopLink: "linkebay", shopLogoUrl: "icon Store/ebay33.png", price: 0, priceUpdate: "Ebay.com", storeName: "Ebay" }, ]; for (i = 0; i < products.length; i++) { if (products[i].price == 0) { products.splice(i, 1) } } console.log(products)
Está modificando la matriz en medio de un bucle. Esto hace que la matriz se reduzca, por lo i
ahora me refiero a un elemento diferente. Cuando i
incrementa, terminas omitiendo un valor. Una posible solución es cambiar i
al mismo tiempo que modifica la matriz:
for (i = 0; i < products.length; i++) { if (products[i].price == 0 ) { products.splice(i, 1) i -= 1; // <--------------- added } }
O puede considerar usar otro enfoque, como el método .filter
en matrices:
products = products.filter(product => product.price !== 0);
Intenta usar algo como:
const arr = products.filter(x => x.price > 0);
Incluso puede agregar conversión a Number();
El problema es lo que dijeron @epascarello y @dm en los comentarios, eliminarlos cambiará el índice de elementos en la matriz , por lo que su ciclo perderá algunos de ellos.
Y la respuesta estándar es lo que dijo @aayoub-el-aboussi
Pero si desea mantener el for loop
for para un better performance
, solo tiene que invertir el ciclo , lo que significa intentar contar de principio a fin. Como el ejemplo:
for loops
var products = [{ specs: "name", shopLink: "linamazon", shopLogoUrl: "icon Store/Amazon22.png", price: 0, priceUpdate: "Amazon.com", storeName: "Amazon" }, { specs: "name", shopLink: "linknewegg", shopLogoUrl: "icon Store/NewEgg.png", price: 0, priceUpdate: "NewEgg.com", storeName: "NewEgg" }, { specs: "name", shopLink: "linknoon", shopLogoUrl: "icon Store/noon-logo2.png", price: 0, priceUpdate: "icon Store/Noon.com", storeName: "Noon" }, { specs: "name", shopLink: "linkebay", shopLogoUrl: "icon Store/ebay33.png", price: 0, priceUpdate: "Ebay.com", storeName: "Ebay" }, ]; for (i = products.length-1; i >=0; i--) { if (products[i].price == 0) { products.splice(i, 1) } } console.log(products)