Recién comencé a aprender JavaScript y me encontré con un problema de este tipo, tengo una matriz anidada, quiero resumir el valor del precio de estas matrices y devolver la suma existente, me pregunto qué método es aplicable para él, que no perjudica el rendimiento , necesito un ejemplo para entender la forma de resolver el problema. Gracias por adelantado
const initialData = [ { title: 'm2212', data: [ { id: 98233181232, variations:[{ warranty: '', price: 120, comment: '', }] }, ] }, { title: 'm2', data: [ { id: 982812, variations:[{ warranty: '', price: 92, comment: '', }] }, { id: 92182812, variations:[{ warranty: '', price: 922, comment: '', }] }, ] }, ] //what i tried let sum = 0 initialData.forEach((el)=>{ el.data.forEach((el1)=>{ sum = sum + el1.variations[0].price }) }) console.log(sum);Su estructura de datos parece bastante simple, así que explicaré en un lenguaje sencillo cómo lograrlo:
La forma simple y directa es ignorar todas las cosas funcionales sofisticadas que puede hacer en las matrices, y simplemente hacer esto:
Establezca una variable de sum igual a 0. Repita cada elemento de initialData . En cada elemento, itere sobre cada elemento de data . En cada elemento data , itere sobre cada elemento de variations . Agregue la propiedad de price a su variable de sum .
El enfoque más simple y eficaz sería algo como este código:
const sum = initialData.reduce((sum, item) => { const itemSum = item.data.reduce((dataSum, dataItem) => { const itemDataSum = dataItem.variations.reduce((variantsSum, variantItem) => { return variantsSum + variantItem.price; }, 0); return dataSum + itemDataSum; }, 0); return sum + itemSum; }, 0); const initialData = [ { title: "m2212", data: [ { id: 98233181232, variations: [ { warranty: "", price: 120, comment: "" } ] } ] }, { title: "m2", data: [ { id: 982812, variations: [ { warranty: "", price: 92, comment: "" } ] }, { id: 92182812, variations: [ { warranty: "", price: 922, comment: "" } ] } ] } ]; const sum = initialData.reduce((sum, item) => { const itemSum = item.data.reduce((dataSum, dataItem) => { const itemDataSum = dataItem.variations.reduce((variantsSum, variantItem) => { return variantsSum + variantItem.price; }, 0); return dataSum + itemDataSum; }, 0); return sum + itemSum; }, 0); console.log(sum);Puede agregar algunas comprobaciones para tener una matriz u objeto y, de ser así, iterar los valores.
Este enfoque no necesita conocer la estructura de los datos, requiere una búsqueda en amplitud para encontrar la clave deseada.
const sum = (value, key) => { if (!value || typeof value !== 'object') return 0; if (Array.isArray(value)) return value.reduce((t, o) => t + sum(o, key), 0); if (key in value) return value[key]; return sum(Object.values(value), key); }, data = [{ title: 'm2212', data: [{ id: 98233181232, variations: [{ warranty: '', price: 120, comment: '' }] }] }, { title: 'm2', data: [{ id: 982812, variations: [{ warranty: '', price: 92, comment: '' }] }, { id: 92182812, variations: [{ warranty: '', price: 922, comment: '' }] }] }]; console.log(sum(data, 'price'));