Q200232

by jun68ykt

HTML

<script src="https://getfirebug.com/firebug-lite-debug.js"></script>

JavaScript

function makeCSVData(dataObj, columns) {
  const keys = Object.keys(dataObj).sort();  
  
  const lengths = keys.reduce((m, k) => m.set(k, Math.max(...dataObj[k].map(ary => ary.length))), new Map());

  const header = keys.reduce((ary, k) => 
    ary.concat([...Array(lengths.get(k))].map((_, i) => `${k}-${columns[i]}`)), []);
  
  const numRows = Math.max(...Object.values(dataObj).map(ary => ary.length));
  
  const data = [...Array(numRows)].reduce((ary, _, i) => {
      ary.push(keys.reduce((a, k) => 
        a.concat(
          dataObj[k][i] ?
            [...dataObj[k][i], ...Array(lengths.get(k) - dataObj[k][i].length ) ] :
            [...Array(lengths.get(k))]
        ) ,[]));
      return ary;
    },
    [header]);
    
  return data;
}


const d1 = [
  [1,'A'],
  [2,'B'],
  [3,'C'],
  [-1,'a']
];

const d2 = [
  [4,'D', true],
  [5,'E'],
  [6,'F', false, 100]
];

const d3 = [
  [7,'X'],
  [8,'Y'],
  [9,'Z'],
  [-7, 'x'],
  [-8, 'y']  
];

const data = makeCSVData({ d1, d2, d3 }, ['num', 'alpha', 'beta', 'gamma']);

data.forEach(line => {
  console.log(line.join(','));
});