【问题标题】:Nested arrays in object json to csv对象 json 中的嵌套数组到 csv
【发布时间】:2016-12-11 14:21:53
【问题描述】:

我正在使用“json-csv”库从用户数组中创建一个 csv,其中包含嵌套对象和数组。

var users = [
    {
      subscriptions: [
        {
          package : {
            name: 'Grammar'
          },
          state: 'EXPIRED',
          timerange: {
            period : 5550
          },
          transaction:{
            amount: 10000
          }
        },
        {
          package : {
            name: 'GK'
          },
          state: 'ACTIVE',
          timerange: {
            period : 30
          },
          transaction:{
            amount: 10340
          }
        },
      ],
      account:{
        balance: 200
      },
        name: "Johhy Moe",
        email: null,
        user_id: "123456789",
        username: null,
        user_type: "facebook",
        id: 3,
        createdAt: "2016-07-11T08:02:40.000Z",
        updatedAt: "2016-07-11T08:02:40.000Z",

    },
    {
      subscriptions: [
        {
          package : {
            name: 'GK'
          },
          state: 'EXPIRED',
          timerange: {
            period : 42
          },
          transaction:{
            amount: 5252
          }
        },
        {
          package : {
            name: 'MATH'
          },
          state: 'ACTIVE',
          timerange: {
            period : 25
          },
          transaction:{
            amount: 200
          }
        }
      ],
      account:{
        balance: 1500
      },
      name: "John Doe",
      email: null,
      user_id: "123456789",
      username: null,
      user_type: "facebook",
      id: 7,
      createdAt: "2016-07-29T06:44:18.000Z",
      updatedAt: "2016-07-29T06:44:18.000Z"
      },
]

现在我希望生成的 csv 是这样的 用户 ID、姓名、FBID、帐户、订阅、价格、状态、时间段

3,Johhy Moe,123456789,200,Grammar,10000,EXPIRED,5550

3,Johhy Moe,123456789,200,GK,10340,ACTIVE,30

7,John Doe,123456789,1500,GK,5252,EXPIRED,30

7,John Doe,123456789,1500,MATH,200,ACTIVE,25

如您所见,每个用户的订阅数组中是否有两个对象,我想再次重复该用户,但订阅数据不同。

我曾考虑使用该库,因为我的用户数组可以达到数千个订阅数以百计的用户。

我不知道我应该做什么。 我的代码:

var options=  {
  fields : [
    {
      name : 'id',
      label : 'USERID'
    },
    {
      name : 'name',
      label : 'Name'
    },
    {
      name : 'user_id',
      label : 'FBID'
    },
    {
      name : 'account.balance',
      label : 'ACCOUNT'
    },
    {
      name: '',
      label: 'Subscription'
    }
  ]
}
var source = es.readArray(users)
source
  .pipe(jsoncsv.csv(options))
  .pipe(res)

我也不想使用库。因此,如果有人可以为我提供资源来制作我自己的带有字符串的 csv 文件并使用流,那就太好了。谢谢!!

【问题讨论】:

    标签: json node.js csv express sails.js


    【解决方案1】:

    这将解决您的问题。现在您只需将 console.log 更改为 fs 并写入您的文件。

    var json2csv = function (json, listKeys) {
        var str    = "";
        var prefix = "";
        for (var i = 0; i < listKeys.length; i++) {
            str += prefix + json[listKeys[i]];
            prefix = ",";
        }
        return str;
    };
    
    var async = require('async');
    var csvData = ['USERID,NAME,FBID,ACCOUNT,SUBSCRIPTION,PRICE,STATE,TIMEPERIOD'];
    async.each(users, function (user, callback) {
        var csvRow1 = {
            USERID:  user.id,
            NAME:    user.name,
            FBID:    user.user_id,
            ACCOUNT: user.account.balance
        };
        async.each(user.subscriptions, function (subscription, callback) {
            var csvRow2          = JSON.parse(JSON.stringify(csvRow1));
            csvRow2.SUBSCRIPTION = subscription.package.name;
            csvRow2.PRICE        = subscription.transaction.amount;
            csvRow2.STATE        = subscription.state;
            csvRow2.TIMEPERIOD   = subscription.timerange.period;
            csvData.push(json2csv(csvRow2, ['USERID', 'NAME', 'FBID', 'ACCOUNT', 'SUBSCRIPTION', 'PRICE', 'STATE', 'TIMEPERIOD']));
            callback(null);
        }, function (err) {
            callback(err);
        });
    }, function (err) {
        if (err) {
            // return err;
        } else {
            // return csvData;
        }
    });
    

    【讨论】:

    • 对成千上万的用户使用它会有效吗?在此示例中,您只是将其记录到控制台,但我需要将整个数据作为响应发送。
    • 如果您不需要将结果按照用户出现在数组中的顺序排列,那么我可以将其更改为非常高效...
    • 改变了答案...现在检查@amit-adhikari
    猜你喜欢
    • 2023-02-14
    • 2021-07-19
    • 2013-09-29
    • 2019-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多