Tengo un archivo JSON con una matriz que tiene objetos anidados y matrices que simulan un carrito de compras. Quiero verificar si hay valores duplicados y, si los hay, actualizar el valor de la cantidad del artículo; de lo contrario, simplemente agregue los artículos al carrito.
Aquí está el archivo JSON:
[ { "email": "tshepo@email.com", "status": "OPEN", "items": [ { "name": "hamster", "quantity": 2, "price": 20 }, { "name": "saw dust", "quantity": 1, "price": 20 }, { "name": "hamster-cage", "quantity": 1, "price": 150 }, { "name": "book: how to care for your hamster", "quantity": 1, "price": 150 }, { "name": "hamster-cage", "quantity": 1, "price": 150 } ] } ]Y esto es lo que he hecho hasta ahora:
const data = require("./data.json"); function checkIfPresent(key){ let ans = data.findIndex((obj) => Object.values(obj).includes(key)) return ans; } for(let x = 0; x < data.length; x++) { let arr; if(checkIfPresent(data[x].items)){ arr[ans].quantity += data[x].items.quantity; }else{ arr.push(data[x].items); } }El código no funciona como se supone que debe hacerlo, por favor ayuda.
Hubo bastantes errores en su código, los he corregido. Lo que pareció confundirlo más fue que tenía una matriz de un solo elemento, es decir, un objeto, que tiene un miembro de items que también es una matriz. Entonces, necesitábamos referir data[0].items[x] en lugar de data[x] . Además, en su función checkIfPresent verificó si data contienen el elemento, lo que obviamente es cierto. Siempre. En su lugar, deseaba verificar si un artículo con el mismo nombre ya se había procesado, por lo que necesitaba verificar si arr ya tenía este valor. Finalmente, arr se inicializa en cada iteración de su ciclo, lo que elimina todo lo que se almacenó en una iteración anterior y lo hace inaccesible fuera del ciclo. Moví la inicialización fuera del ciclo. Además, dado que sus data tienen una matriz, parece que puede tener varias compras. En cuyo caso, puede envolver otro bucle alrededor del bucle que ya tiene y también el índice principal de data de bucle.
let data = [ { "email": "tshepo@email.com", "status": "OPEN", "items": [ { "name": "hamster", "quantity": 2, "price": 20 }, { "name": "saw dust", "quantity": 1, "price": 20 }, { "name": "hamster-cage", "quantity": 1, "price": 150 }, { "name": "book: how to care for your hamster", "quantity": 1, "price": 150 }, { "name": "hamster-cage", "quantity": 1, "price": 150 } ] } ] function checkIfPresent(key, array){ let ans = array.findIndex((obj) => obj.name === key) return ans; } let arr = [];var ans; for(let x = 0; x < data[0].items.length; x++) { if((ans = checkIfPresent(data[0].items[x].name, arr)) >= 0){ arr[ans].quantity += data[0].items[x].quantity; }else{ arr.push(data[0].items[x]); } } console.log(arr);