tengo el siguiente objeto javascript
const reizen = { personen: [ { naam: "Bob", reizen: [ { locatie: "Frankrijk", uitgaven: [ { voorwerp: "Sokken", prijs: 15 }, { voorwerp: "Sleutelhanger", prijs: 6 }, { voorwerp: "Restaurant", prijs: 26 }, ] }, { locatie: "Duitsland", uitgaven: [ { voorwerp: "Taxi", prijs: 30 }, ] } ] }, ] }Estoy tratando de obtener la suma de todos los valores donde dice 'prijs' (está en holandés) ¿Hay una manera 'fácil' de hacer esto?
EDITAR: ¡Gracias a todos por las increíbles respuestas! Lo hice funcionar gracias a ustedes.
No es totalmente sexy, y en realidad no haría esto, pero para dar una alternativa a los mapas/reducciones, etc., especialmente si la estructura del objeto es variable o desconocida, la forma más sencilla de obtener el recuento total sin recurrencia es encadenar el objeto. (JSON.stringify), dividir en "prijs" para dar una matriz de cadenas que comienzan con los números de destino y luego (ignorando el primer elemento que no contiene ningún valor de destino), parseFloat las cadenas (que analizarán los caracteres enteros hasta el primer carácter no entero) para obtener los números y sumar.
const reizen = { personen: [ { naam: "Bob", reizen: [ { locatie: "Frankrijk", uitgaven: [ { voorwerp: "Sokken", prijs: 15 }, { voorwerp: "Sleutelhanger", prijs: 6 }, { voorwerp: "Restaurant", prijs: 26 }, ] }, { locatie: "Duitsland", uitgaven: [ { voorwerp: "Taxi", prijs: 30 }, ] } ] }, ] } const stringifiedObj = JSON.stringify(reizen); const portions = stringifiedObj.split('prijs\":'); let count = 0; for(let i = 1; i < portions.length; i++) { count += parseFloat(portions[i]) } console.log(count) // gives 77 (15 + 6 + 26 + 30)al nivel de reizen (segundo)
function getTotalPrijs(reizen_){ // var reizen_ = reizen.personen[0].reizen; let _prijs = 0 reizen_.map((item, index)=>{ const uitgaven = item.uitgaven; uitgaven.map(itm => typeof itm.prijs === "number"? _prijs+=itm.prijs : null) }) return _prijs }a nivel de personen (primero)
var total_prijs = 0 reizen.personen.map(item =>{ const reizen = item.reizen; total_prijs+=(getTotalPrijs(reizen)) }) console.log(total_prijs)Si necesita hacer frente a los prijs que aparecen en lugares que no están bien definidos, puede hacer algo como lo siguiente usando la recursividad:
const reizen = {"personen":[{"naam":"Bob","reizen":[{"locatie":"Frankrijk","uitgaven":[{"voorwerp":"Sokken","prijs":15},{"voorwerp":"Sleutelhanger","prijs":6},{"voorwerp":"Restaurant","prijs":26}]},{"locatie":"Duitsland","uitgaven":[{"voorwerp":"Taxi","prijs":30}]}]}]}; const random = { one: { prijs: 6 }, two: [ { prijs: 12, other: [{ prijs: 7 }, { prijs: 3 }] }, { prijs: 2, something: 'fred' }, ], }; const sum_prijs = (source) => Array.isArray(source) ? source.map(sum_prijs).reduce((a, b) => a + b) : Object.entries(source).reduce( (acc, [key, val]) => acc + ((typeof val === 'object') ? sum_prijs(val) : (key === 'prijs' ? val : 0)), 0 ); console.log(sum_prijs(reizen)); console.log(sum_prijs(random));Básicamente lo mismo pero sin recursividad:
const reizen = {"personen":[{"naam":"Bob","reizen":[{"locatie":"Frankrijk","uitgaven":[{"voorwerp":"Sokken","prijs":15},{"voorwerp":"Sleutelhanger","prijs":6},{"voorwerp":"Restaurant","prijs":26}]},{"locatie":"Duitsland","uitgaven":[{"voorwerp":"Taxi","prijs":30}]}]}]}; const random = { one: { prijs: 6 }, two: [ { prijs: 12, other: [{ prijs: 7 }, { prijs: 3 }] }, { prijs: 2, something: 'fred' }, ], }; const push_concat = (array1, array2) => { for(let i = 0; i < array2.length; i++) array1.push(array2[i]); return array1; }; const sum_prijs = (source) => { let sum = 0; let queue = [source]; while(queue.length > 0) { let item = queue.pop(); if(Array.isArray(item)) push_concat(queue, item); else Object.entries(item).forEach(([key, val]) => { if(typeof val === 'object') queue.push(val); else if(key === 'prijs') sum += val; }); } return sum; }; console.log(sum_prijs(reizen)); console.log(sum_prijs(random));