Tengo una serie de objetos como este:
originalArray = [ { "16": { "id": 23, "data": "11",}, "17": { "id": 28, "data": "25",},..., "header": "Row 2","id": 6}, { "16": { "id": 23, "data": "AA",}, "17": { "id": 28, "data": "!!",},..., "header": "Row 2","id": 6}, .... ]Donde cada elemento de la matriz es un objeto y dentro de cada objeto hay varios pares clave-valor. Los pares clave-valor (aparte de los dos últimos elementos con encabezado e id de claves) vienen en el formato
"number": {"id": x, "data" = "something"}Puede haber múltiples objetos y múltiples pares clave-valor dentro de la matriz y las claves son consistentes entre cada objeto, es decir, si hay una clave en el primer objeto, existe en todos los objetos dentro de la matriz, por ejemplo, "16" y "17". "
Escribí un método para obtener los datos de esa matriz así:
createArrays() { this.originalArray.forEach(row => { Object.entries(row).forEach(([key, value]) => { console.log(key, value['data']) }) }); }Esto me permite obtener la clave y el valor de datos asociado en cada objeto. Para cada clave (aparte del encabezado y la identificación), ¿cómo puedo crear una nueva matriz y completarla con el valor de esa clave?
Resultado deseado basado en originalArray:
gridData_16 = ["11", "25", ...] gridData_17 = ["AA", "!!", ...] ....Explicación: obtenemos nuevas matrices que comienzan con gridData_ y la última parte proviene de la clave en originalArray. Cada valor en la matriz proviene del valor de datos para cada clave con el mismo número. Por ejemplo, en originalArray, tenemos la clave "16" y los "datos" que son iguales a "11" y "25" para cada objeto de la matriz, por lo que completamos gridData_16 = ["11", "25", ... ]
Sé que puedo crear una matriz fuera de Object.keys y simplemente completar esa única matriz con todos los datos usando un método .push. Sin embargo, esa no es la estructura correcta y no estoy seguro de cómo avanzar:
createArrays() { this.gridData = [] this.originalArray.forEach(row => { Object.entries(row).forEach(([key, value]) => { this.gridData.push(value['data']) }) }); }Aquí hay un enfoque que usa reduce() con Object.entries() para crear un objeto de resultado que agrupa los valores de datos por clave:
const array = [ {"16": {"id": 23, "data": "11"}, "17": {"id": 28, "data": "25"}, "header": "Row 2", "id": 6}, {"16": {"id": 23, "data": "AA"}, "17": {"id": 28, "data": "!!"}, "header": "Row 2", "id": 6} ]; const result = array.reduce((a, v) => { Object.entries(v).forEach(([k, v]) => { if (k.match(/[0-9]+/)) { a[k] = a[k] || []; a[k].push(v.data); } }); return a; }, {}); console.log(result);Puede crear un objeto con las propiedades deseadas y agregar los valores allí, luego simplemente puede cambiarlo a matriz si lo necesita en ese formato
const originalArray = [ { "16": { "id": 23, "data": "11",}, "17": { "id": 28, "data": "25",}, "header": "Row 2","id": 6}, { "16": { "id": 23, "data": "AA",}, "17": { "id": 28, "data": "!!",}, "header": "Row 2","id": 6} ] function createArrays(originalArray) { const gridData = {} originalArray.forEach(row => { Object.entries(row).forEach(([key, value]) => { if(value.data){ gridData['gridData_' + key] = gridData['gridData_' + key] || [] gridData['gridData_' + key].push(value.data) } }) }); return gridData } console.log(createArrays(originalArray))Simplemente puede lograr esto sin muchas modificaciones en su código existente.
Demostración en vivo :
// Input Array let originalArray = [{ "16": { "id": 23, "data": "11" }, "17": { "id": 28, "data": "25" }, "header": "Row 2", "id": 6 }, { "16": { "id": 23, "data": "AA" }, "17": { "id": 28, "data": "!!" }, "header": "Row 2", "id": 6 }]; // Declaring an empty object to assignt the result. let obj = {}; // Iterating original array to access the object enteries and get the values. originalArray.forEach(row => { Object.entries(row).forEach(([key, value]) => { if (!isNaN(key)) { if (!obj[key]) { obj[key] = []; } obj[key].push(value.data) } }) }); // Output console.log(obj);