Angular 2-从嵌套数组创建CSV文件

时间:2018-06-28 07:22:12

标签: arrays node.js angular typescript mean-stack

我正在尝试从看起来像这样的嵌套数组中为csv文件创建对象-

[
  {
    "Name":obj.name,
    "Age": obj.age,
    "Class":obj.class
  }
]

我已经使用类似于-

的代码生成了此数组
let obj = originalObj.map(studentObj => {
   return {
     "Name":studentObj.name,
     "Age":studentObj.age,
     "class":studentObj.class
   }
}

现在,obj.class是逗号分隔值(即maths,biology,physics)的对象。类的数量不是固定的,不是动态的,我的意思是一个人可以有2个类或3个或4个类,或者根本没有任何类。我要生成的csv应该看起来像这样-

| Name | Age | Class     | Class     | Class      |
|------|-----|-----------|-----------|------------|
| abc  | 12  |           |           |            |
| xyz  | 18  | Computers |           |            |
| ijk  | 20  | Astronomy | Geography | Science    |

如何转换数组对象以生成所需的对象,该对象可以生成与上述类似的csv?除非绝对必要,否则我最好不使用任何外部npm库。

我尝试使用@Mr下面提供的示例代码。 Ratnadeep可以很好地工作,如果类的数量是固定的,但是在我的情况下,第一条记录没有一个类,因此在转换为csv时,根本不会为该类生成键。需要帮助解决这个挑战,我已经不懂事了。

2 个答案:

答案 0 :(得分:2)

JSON不包含具有相同名称的多个键。相反,我已经实现了。使用原始对象中的样本数据实现,您可以根据需要对其进行修改。 名称|年龄| class1 | class2 | class3 ...

使用了jsonexport npm软件包来创建csv。

var myData = [
  {
    "Name":'John',
    "Age": 28,
    "Classes":"Maths,Biology,Physics"
  }
]

for(var i=0;i<myData.length;i++){
    var arrClass = myData[i].Classes.split (',');
    delete myData[i].Classes
    arrClass.forEach(function(ele,index){
        var keyName = 'class'+(index+1);
        myData[i][keyName]= ele;
    });
}
jsonexport(myData,function(err, csv){
    if(err) return console.log(err);
    console.log(csv);
    fs.writeFile('test.csv',csv,function(err){
        console.log(err);
    });
});

输出: enter image description here

  • 更新后的答案

我不知道您如何生成csv。但是我已经准备好了最终的myData数组json对象。 class列本质上是动态的。

var myData = [
  {
        "Name":'abc',
        "Age": 12 
    },
    {
        "Name": 'xyz',
        "Age": 18,
        "Classes": "Computers"
    },
    {
        "Name": 'ijk',
        "Age": 20,
        "Classes": "Astronomy,Geography,Science"
    }
]

for(var i=0;i<myData.length;i++){
    if (myData[i].hasOwnProperty("Classes")){
        var arrClass = myData[i].Classes.split(',');
        delete myData[i].Classes;
        arrClass.forEach(function (ele, index) {
            var keyName = 'class' + (index + 1);
            myData[i][keyName] = ele;
        });
    }
}
jsonexport(myData,function(err, csv){
    if(err) return console.log(err);
    console.log(csv);
    fs.writeFile('test.csv',csv,function(err){
        console.log(err);
    });
});

输出 enter image description here

答案 1 :(得分:1)

预期结果不是有效的CSV。您不能有三个具有相同名称的列。但是您可以将obj.class保留为csv字符串。天真的和不完整的实现可能是:

function toCSV(items, separator=';') {
  if (!items.length) return '';

  const columns = Object.keys(items[0]).join(separator);
  const body = items.map(item =>
    Object.values(item).join(separator)
  ).join('\n');

  return columns + '\n' + body;
}