Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

191
Views
¿Cómo convertir varias matrices en columnas CSV usando JavaScript?

Objetivo: convertir varias matrices de JavaScript en columnas CSV.

Contexto: usar una API para escanear una flota de activos con unidades de GPS y comprender una lista de qué activos están inactivos, entre otras métricas.

Problema: la parte con la que necesito ayuda es el algoritmo en mi ciclo for anidado que determina el índice para insertar la celda en la fila/columna correcta.

He mirado muchos paquetes en NPM, pero no parece que haya podido convertir fácilmente varias matrices en columnas CSV.

Todavía no he necesitado hacer una pregunta aquí, por lo que es posible que esté haciendo esto de manera incorrecta o que me haya perdido una solución para esto; por lo que cualquier ayuda o sugerencia para lograr el objetivo es muy apreciada.

El código de ejecución está debajo, pero el resultado deseado sería:

 All Assets,Idle Assets 1000,2001, 1001,2002, 1002,2003, 1003,2004, 1004,,

Más bien que:

 All Assets,Idle Assets 1000,2001, 2002, 2003, 2004, , 1001,1002,1003,1004, 

 //Sample Array Data (can handle more arrays/columns) const allAssets = ['1000', '1001', '1002', '1003', '1004']; const idleAssets = ['2001', '2002', '2003', '2004']; ////Arrays to CSV columns const headers = ['All Assets', 'Idle Assets']; const columns = [allAssets, idleAssets]; //Identify columnLen (# of arrays) & rowLen (length of longest array) let longestArr = 0; columns.forEach((arr) => arr.length > longestArr ? longestArr = arr.length : undefined); const rowLen = longestArr; const columnLen = columns.length; const heading = (headers.join(',')).concat('\n'); const csvConstructor = () => { const data = []; for (let column = 0; column < columnLen; column++) { const columnArray = columns[column]; for (let row = 0; row < rowLen; row++) { let cell; //Account for different sized arrays columnArray[row] === undefined ? cell = ',' : cell = columnArray[row].concat(','); //New line for cells in last column (columns.length - 1) === column ? cell = cell.concat('\n') : undefined; //Dynamically insert cell into appropriate data index const insertAt = column + row; //<--- Need help here data.splice(insertAt, 0, cell); } } const result = heading.concat(data.join('')); return result } const csv = csvConstructor(); console.log(csv);

about 4 years ago · Juan Pablo Isaza
2 answers
Answer question

0

Su csvConstructor() está iterando columnas individualmente, pero para una tabla, necesita iterar columnas en paralelo. Además, está tratando de hacer malabares con dos preocupaciones diferentes al mismo tiempo (transformar los datos y construir la cadena csv), por lo que es un poco difícil de seguir.

El problema se divide lógicamente en dos fases. En la primera fase, desea una matriz bien formateada que refleje la estructura tabular del CSV (o si se trata de un conjunto de datos grande, entonces probablemente desee un iterador que produzca filas una por una, pero no haré esa versión aquí) .

La salida debe estar en este formato:

 const result = [ [header A, header B], [value A, value B], [value A, value B], // ...etc... ]

Una vez que tengamos esa estructura, podemos transformarla en CSV.

Entonces, para obtener eso en función de sus datos:

 function toCsvRows(headers, columns) { const output = [headers] const numRows = columns.map(col => col.length) .reduce((a, b) => Math.max(a, b)) for (let row = 0; row < numRows; row++) { output.push(columns.map(c => c[row] || '')) } return output } function toCsvString(data) { let output = '' data.forEach(row => output += row.join(',') + '\n') return output } function csvConstructor(headers, columns) { return toCsvString(toCsvRows(headers, columns)) }

Aquí hay un violín de trabajo:

https://jsfiddle.net/foxbunny/fdxp3bL5/

EDITAR: En realidad, déjame hacer la versión eficiente en memoria también:

 function *toCsvRows(headers, columns) { yield headers const numRows = columns.map(col => col.length) .reduce((a, b) => Math.max(a, b)) for (let row = 0; row < numRows; row++) { yield columns.map(c => c[row] || '') } } function toCsvString(data) { let output = '' for (let row of data) { output += row.join(',') + '\n' } return output } function csvConstructor(headers, columns) { return toCsvString(toCsvRows(headers, columns)) }
about 4 years ago · Juan Pablo Isaza Report

0

Si desea una forma simple de usar zip dos matrices con coma. luego une el header y las filas comprimidas con \n .

 const allAssets = ['1000', '1001', '1002', '1003', '1004'], idleAssets = ['2001', '2002', '2003', '2004'], headers = ['All Assets', 'Idle Assets'], zip = (a, b) => a.map((k, i) => `${k}, ${b[i]||''}`), zipLonger = (a, b) => a.length > b.length ? zip(a, b) : zip(b, a); console.log(headers.join(', ')+'\n'+ zipLonger(allAssets, idleAssets).join('\n'))

Resultado:

 All Assets, Idle Assets 1000, 2001 1001, 2002 1002, 2003 1003, 2004 1004,
about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!