Quiero actualizar la matriz de objetos solo después de que se hayan pasado todas las comprobaciones. Tengo una matriz de objetos que representan todos los artículos y otra matriz de objetos que representa todo el stock disponible.
Quiero verificar si todos los artículos están en stock, solo quiero actualizar la matriz de stock. Aquí está mi código:
const articles = [{ "id": "1", "quantity": "4" }, { "id": "2", "quantity": "8" }, { "id": "4", "quantity": "1" }]; let stock = [ { "id": "1", "stock": "6" }, { "id": "2", "stock": "6" }, { "id": "3", "stock": "2" }, { "id": "4", "stock": "2" } ]; articles.map(article => { stock.map(item => { if(item.id === article.id){ if(article.quantity <= item.stock){ item.stock = item.stock - article.quantity; } else { console.log('error'); throw error; } } }); }); El problema con esta solución es que actualiza el stock para id = 1 aunque id = 2 no es suficiente. Estoy tratando de verificar si todos los artículos están en stock en cantidad suficiente y actualizarlos (menos) en la matriz de stock. Entonces, en este caso, el código actualizará la matriz de stock de esta manera:
stock = [ { "id": "1", "stock": "2" }, { "id": "2", "stock": "6" }, { "id": "3", "stock": "2" }, { "id": "4", "stock": "2" } ];¿Puede alguien sugerir cómo puedo arreglar esto?
Puede usar Array.prototype.find() . Nota: el fragmento asume que todos los artículos tienen una propiedad "id" , no busca "art_id" .
const articles = [{ "id": "1", "quantity": "4" }, { "id": "2", "quantity": "8" }, { "id": "4", "quantity": "1" }]; let stock = [{ "id": "1", "stock": "6" }, { "id": "2", "stock": "6" }, { "id": "3", "stock": "2" }, { "id": "4", "stock": "2" } ]; // Use Array.prototype.some() to check for items that don't have enough stock const haveEnough = !articles.some(article => // Turns "1" into 1 parseInt( // Find the stock with the same id as the article stock.find(stock => stock.id === article.id).stock ) < parseInt(article.quantity)) console.log(haveEnough) A continuación, puede actualizar el stock en
if (haveEnough) { // Do something }Supongo que la clave art_id en la matriz de articles debería ser id .
Desafortunadamente, no puede hacerlo todo en un ciclo y, en cambio, primero tendrá que recorrer todos los artículos para averiguar si su stock es suficiente y luego recorrerlos nuevamente para cambiar el stock existente:
const articles = [ { id: '1', quantity: '4', }, { id: '2', quantity: '5', }, { id: '4', quantity: '1', }, ]; let stock = [ { id: '1', stock: '6', }, { id: '2', stock: '6', }, { id: '3', stock: '2', }, { id: '4', stock: '2', }, ]; // Are there any articles that do not have enough stock const outOfStockArticles = articles.find((article) => { const articleStock = stock.find((stock) => stock.id === article.id); return Number.parseInt(article.quantity) > Number.parseInt(articleStock.stock); }); // If there are no out of stock articles - change existing stock values if (!outOfStockArticles) { articles.forEach((article) => { const articleStock = stock.find((stock) => stock.id === article.id); articleStock.stock = Number.parseInt(articleStock.stock) - Number.parseInt(article.quantity); }); }Hay una inconsistencia en su matriz de artículos, supongo que cada artículo tiene un "art_id", y no algunos un "id" y algunos un "art_id".
Simplemente puede encontrar su artículo usando la función Array.prototype.find, y luego con la función isAvailable verificar que un artículo esté presente en la cantidad correcta en la lista de existencias.
¡Ahora puedes usar la función Array.prototype.every que hace exactamente lo que quieres! Devolverá verdadero solo si todos los elementos de la matriz satisfacen la condición, en nuestro caso, la función isAvailable .
Aquí un violín simple:
const articles = [{ "art_id": "1", "quantity": "4" }, { "art_id": "2", "quantity": "8" }, { "art_id": "4", "quantity": "1" }]; const stock = [{ "id": "1", "stock": "6" }, { "id": "2", "stock": "6" }, { "id": "3", "stock": "2" }, { "id": "4", "stock": "2" } ]; const isAvaiable = (article) => { return stock.find(element => element.id === article.art_id).stock >= article.quantity; } if (articles.every(isAvaiable)) { console.log("I can update") } else { console.log("I cannot update") }