Estoy tratando de convertir una matriz que existe de objetos con una matriz anidada dentro en una nueva matriz que consta de los valores dentro de la matriz anidada por separado (puede sonar muy complicado pero el ejemplo se muestra muy claro)
Lo que tengo:
const values = [{ geometry: { "coordinates": [11.4828, 59.1264], "Type": "point" }, properties: { Region: "Oklahoma", sales: { donuts: { 2005: 5, 2006: 8, 2007: 10 }, apples: { 2005: 10, 2006: 8, 2007: 10 } } } }, { geometry: { "coordinates": [9.4828, 76.1264], "Type": "point" }, properties: { Region: "Texas", sales: { donuts: { 2005: 8, 2006: 0, 2007: 7 }, apples: { 2005: 7, 2006: 9, 2007: 4 } } } } ] const filterValue = "donuts"Cuál es mi objetivo:
newValues =[{geometry: {"coordinates": [11.4828, 59.1264],"Type":"point"},properties:{Region: "Oklahoma",value:5,time:2005}},{geometry: {"coordinates": [11.4828, 59.1264],"Type":"point"},properties:{Region: "Oklahoma",value:8,time:2006}},{geometry: {"coordinates": [11.4828, 59.1264],"Type":"point"},properties:{Region: "Oklahoma",value:10,time:2007}} AND SO ON FOR ALL THE values that are in const donuts/filter for each value. Could also switch out value for donuts if that is easier } ]Lo que he probado hasta ahora:
const newObject = [] values.map((value)=>{ console.log(value.properties.sales.donuts) for (var key in value.properties.sales.donuts) { if (value.properties.sales.donuts.hasOwnProperty(key)) { newObject.push({...value,value.properties:{[key]:value.properties.sales.donuts[key]}) } } }) console.log(newObject)Su sintaxis actual no es válida - value.properties: { no es una clave válida en un objeto literal. Dado que desea que la properties de propiedades de salida contenga datos correspondientes a la región y al año también, debe incluirlos en el objeto que se envía. Dado que tampoco necesita que el año sea una clave en el nuevo objeto, sino un valor (con una propiedad de value ), el objeto que se inserta debe reflejar eso.
Solo debe usar .map cuando devuelve un valor dentro de la función del mapeador para crear una nueva matriz. Si está iterando solo para generar efectos secundarios, debe usar un método de iteración genérico más apropiado, como for..of o forEach . En este caso, dado que desea crear varios objetos en la matriz de salida a partir de un objeto asociado en la matriz de entrada, .flatMap sería más adecuado.
Asigne las entradas .donuts y devuelva el nuevo objeto con geometry y properties .
const values=[{geometry:{coordinates:[11.4828,59.1264],Type:"point"},properties:{Region:"Oklahoma",sales:{donuts:{2005:5,2006:8,2007:10},apples:{2005:10,2006:8,2007:10}}}},{geometry:{coordinates:[9.4828,76.1264],Type:"point"},properties:{Region:"Texas",sales:{donuts:{2005:8,2006:0,2007:7},apples:{2005:7,2006:9,2007:4}}}}]; const filterValue = "donuts"; const output = values.flatMap(({ geometry, properties }) => Object.entries(properties.sales[filterValue]).map(([year, saleCount]) => ({ geometry, properties: { Region: properties.Region, value: saleCount, time: year, } })) ); console.log(output);Necesitarás un mapa plano aquí
const values = [ { geometry: { coordinates: [11.4828, 59.1264], Type: 'point', }, properties: { Region: 'Oklahoma', sales: { donuts: { 2005: 5, 2006: 8, 2007: 10, }, apples: { 2005: 10, 2006: 8, 2007: 10, }, }, }, }, { geometry: { coordinates: [9.4828, 76.1264], Type: 'point', }, properties: { Region: 'Texas', sales: { donuts: { 2005: 8, 2006: 0, 2007: 7, }, apples: { 2005: 7, 2006: 9, 2007: 4, }, }, }, }, ]; const mapData = (data, filterBy) => { return data.flatMap((state) => { return Object.entries(state.properties.sales[filterBy]).map( ([time, value]) => { return { ...state, properties: { region: state.properties.Region, time, value, }, }; } ); }); }; const mappedDonuts = mapData(values, 'donuts'); console.log(mappedDonuts);