He convertido archivos de texto basados en CSV en matrices que contienen encabezados y filas, y ahora quiero convertirlos en la solución dada a continuación. ¿Alguien puede hacer esto usando métodos como map , reduce o lo que sea?
Las matrices que tengo son:
let header = ['a', 'b', 'c', 'd']; let rows = ['1,2,3,4', '5,6,7,8', '9,0,1,2'];El resultado que quiero es:
[{ a: 1, b: 2, c: 3, d: 4, }, { a: 5, b: 6, c: 7, d: 8, }, { a: 9, b: 0, c: 1, d: 2, }]Pude hacer esto usando for loop pero esa no era la solución apropiada para es6.
Arriba mencioné algunas matrices ficticias, en este momento el código real es:
const recordReader = content => { let weatherRecords = []; let rows = content.split('\n'); let headers = rows.shift().split(','); for (let row = 0; row < rows.length; row++) { let weatherReading = {}; if (!rows[row]) { continue; } let record = rows[row].split(','); for (let column = 0; column < headers.length; column++) { weatherReading[headers[column]] = record[column]; } weatherRecords.push(weatherReading); } return weatherRecords; };Podría mapear las filas y reducir la fila a un objeto:
const header = ['a', 'b', 'c', 'd']; const rows = ['1,2,3,4', '5,6,7,8', '9,0,1,2']; const result = rows.map((row) => row.split(',').reduce( (obj, cell, i) => ({ ...obj, [header[i]]: Number(cell), }), {} ) ); console.log(result)con una combinación de map y reduce:
const header = ['a', 'b', 'c', 'd']; const rows = ['1,2,3,4', '5,6,7,8', '9,0,1,2']; const res = rows.map(row => { const columns = row.split(','); return columns.reduce( (acc,cur,i) => ({...acc,[header[i]]:cur}) , {}) } ); console.log(res);Esto admite una sola línea, pero creo que no está muy claro para ver lo que hace:
const header = ['a', 'b', 'c', 'd']; const rows = ['1,2,3,4', '5,6,7,8', '9,0,1,2']; const res = rows.map(row => row.split(',').reduce( (acc,cur,i) => ({...acc,[header[i]]:cur}) , {})); console.log(res);Puede .map() sus elementos de rows a objetos. Para crear el objeto, puede tomar la cadena de números y dividirlos en una matriz, en la que luego usa .map() para tomar los valores numéricos y el encabezado asociado de los headers usando el índice del número actual ( i ) . Al colocarlos en una matriz de pares [key, value] , puede llamar a Object.fromEntries() para construir su objeto. El siguiente también usa el operador unario más ( + ) para convertir su dígito de cadena en un número:
const header = ['a', 'b', 'c', 'd']; const rows = ['1,2,3,4', '5,6,7,8', '9,0,1,2']; const res = rows.map(item => Object.fromEntries(item.split(',').map((n, i) => [header[i], +n])) ); console.log(res); Tenga en cuenta que lo anterior usa Object.fromEntries() que se introdujo después de ES6, puede usar Object.assign() para un enfoque similar, que es ES6:
const header = ['a', 'b', 'c', 'd']; const rows = ['1,2,3,4', '5,6,7,8', '9,0,1,2']; const res = rows.map(item => Object.assign({}, ...item.split(',').map((n, i) => ({[header[i]]: +n}))) ); console.log(res);