tengo un objeto javascript
const data = { type: "FeatureCollection", features: [{ type: "Feature", geometry: { type: "Point", coordinates: [-118.4158548, 33.9811315] }, properties: { name: "John Smith", total_due: 1 } }, { type: "Feature", geometry: { type: "Point", coordinates: [-122.4605458, 37.7286008] }, properties: { name: "June Waters", total_due: 50 } }, { type: "Feature", geometry: { type: "Point", coordinates: [-122.4120835, 37.7778926] }, properties: { name: "John Smith", total_due: 2 } }, { type: "Feature", geometry: { type: "Point", coordinates: [-118.3508279, 34.0701918] }, properties: { name: "June Waters", total_due: 60 } }, { type: "Feature", geometry: { type: "Point", coordinates: [-82.4000143, 34.8518747] }, properties: { name: "Mike Jones", total_due: 30 } }] };Lo que me gustaría hacer es recorrer el objeto, agregar los nombres únicos a un nuevo objeto y sumar los totales. El nuevo objeto se vería así:
newObject = {'June Waters':110, 'Mike Jones':30, 'John Smith': 3}Traté de hacer lo siguiente, pero soy tan nuevo en JS que no sé lo que estoy haciendo.
var newObject = {} data.features.forEach(function (item) { newObject.item.properties.name = newObject.item.properties.name + item.properties.total_due });La siguiente es una parte del error que se genera.
TypeError: Cannot read properties of undefined (reading 'properties') at c:\Users\ryanj\z\const data =.js:10:18 at Array.forEach (<anonymous>)....Cualquier ayuda o sugerencia sería realmente apreciada.
se encontró con un error porque newObject.item no está undefined ya que el objeto está vacío, por lo tanto, cualquier propiedad a la que intente acceder más allá de eso, como las properties , no se encuentra
haciendo algunos ajustes a su implementación. Estoy agregando el nombre al newObject si ya no existe, procedo a agregar los totales
const data = {"type": "FeatureCollection","features": [{"type": "Feature","geometry": {"type": "Point","coordinates": [-118.4158548, 33.9811315]},"properties": {"name": "John Smith","total_due": 1}},{"type": "Feature","geometry": {"type": "Point","coordinates": [-122.4605458, 37.7286008]},"properties": {"name": "June Waters","total_due": 50}},{"type":"Feature","geometry": {"type": "Point","coordinates": [-122.4120835, 37.7778926]},"properties": {"name": "John Smith","total_due": 2}},{"type": "Feature","geometry": {"type": "Point","coordinates": [-118.3508279, 34.0701918]},"properties": {"name": "June Waters","total_due": 60}},{"type": "Feature","geometry": {"type": "Point","coordinates": [-82.4000143, 34.8518747]},"properties": {"name": "Mike Jones","total_due": 30}}]}; var newObject = {} data.features.forEach(function (item) { if(!newObject[item.properties.name])newObject[item.properties.name] = 0; newObject[item.properties.name] = newObject[item.properties.name] + item.properties.total_due }); console.log(newObject) de manera similar, puede usar reduce para este tipo de problemas
const data = {"type": "FeatureCollection","features": [{"type": "Feature","geometry": {"type": "Point","coordinates": [-118.4158548, 33.9811315]},"properties": {"name": "John Smith","total_due": 1}},{"type": "Feature","geometry": {"type": "Point","coordinates": [-122.4605458, 37.7286008]},"properties": {"name": "June Waters","total_due": 50}},{"type":"Feature","geometry": {"type": "Point","coordinates": [-122.4120835, 37.7778926]},"properties": {"name": "John Smith","total_due": 2}},{"type": "Feature","geometry": {"type": "Point","coordinates": [-118.3508279, 34.0701918]},"properties": {"name": "June Waters","total_due": 60}},{"type": "Feature","geometry": {"type": "Point","coordinates": [-82.4000143, 34.8518747]},"properties": {"name": "Mike Jones","total_due": 30}}]}; let total = data.features.reduce((acc,curr) =>{ if(!acc[curr.properties.name])acc[curr.properties.name]=0; acc[curr.properties.name]+=curr.properties.total_due; return acc; },{}) console.log(total)En Javascript, puede hacer referencia a las propiedades de un objeto usando los corchetes [] como lo hacemos en una matriz.
En este código, primero verificamos si la clave ya está definida en el objeto. Si no está definido, simplemente asignaremos el valor de total_due a la clave (que en este caso es el nombre de la persona). En la siguiente iteración, si Javascript reconoce la clave y el valor de la clave no está indefinido, simplemente agregamos el valor total_due al valor de la clave actual.
let finalData = {} data.features.forEach((item) => { if (finalData[item.properties.name] === undefined) { finalData[item.properties.name] = item.properties.total_due; } else { finalData[item.properties.name] += item.properties.total_due; } })