Search code examples
javascriptjsonobjectjavascript-objects

How to download CSV from a nested object in javascript?


I want to iterate over an object in Javascript and create a CSV file from its internal objects.

const list = {
    "right": {
        "label": "Right",
        "items": ["Jack", "Dough"]
    },
    "wrong": {
        "label": "Wrong",
        "items": ["Rain", "Over"]
    },
    "nope": {
        "label": "Nope",
        "items": ["No", "Way"]
    }
};
const downLoadCsv = (list) => {
    let csvContent = '';
    Object.keys(statusM).forEach((obj) => {
      console.log(obj);
      //do something like obj.items and iterate over internal object - items
      //but typeof obj is string here
    });
    const anchorEle = document.createElement('a');
    anchorEle.href = `data:text/csv;charset=utf-8,${encodeURI(csvContent)}`;
    anchorEle.target = '_blank';
    anchorEle.download = `${key}.csv`;
    anchorEle.click();
  };

I tried to iterate over obj but I found that the typeof obj is string. I was rather expecting an object like as follows:-

    {
        "label": "Right",
        "items": ["Jack", "Dough"]
    },

I'm expecting an output like this:-

  Jack, Right
  Dough, Right
  Rain, Wrong
  Over, Wrong
  No, Nope
  Way, Nope

Can someone please help?


Solution

    • so, you need to conver entire object to the next structure:
    [
     ['Jack', 'Right'],
     ['Dough', 'Right'],
    ]
    
    • it accomplished via this: Object.values(list).map(i => i.items.map(j => [j, i.label])).flat()

    • after that i added extra method toCsv for formatting - to allow break line

    const list = {
        "right": {
            "label": "Right",
            "items": ["Jack", "Dough"]
        },
        "wrong": {
            "label": "Wrong",
            "items": ["Rain", "Over"]
        },
        "nope": {
            "label": "Nope",
            "items": ["No", "Way"]
        }
    };
    
    const downLoadCsv = (list) => {
        let csvContent = toCsv(Object.values(list).map(i => i.items.map(j => [j, i.label])).flat());
    
        const anchorEle = document.createElement('a');
        anchorEle.href = `data:text/csv;charset=utf-8,${encodeURI(csvContent)}`;
        anchorEle.target = '_blank';
        anchorEle.download = `test.csv`;
        anchorEle.click();
      };
      
      function toCsv(arr){
        return arr.reduce(function(csvString, row){
            csvString += row.join(',') ;
        csvString += "\r\n";  //";";//"\n";
            return csvString;
        }, '');
    }
    
    downLoadCsv(list)