2016-08-05 3 views
-1

Im, используя библиотеку json-csv для создания csv из массивов пользователей с вложенными объектами и массивами.Вложенные массивы в объекте json to 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, чтобы быть, как это USERID, NAME, FBID, СЧЕТ, подписка, ЦЕНА, ГОСУДАРСТВЕННОЕ, TimePeriod

3, Johhy Моу, 123456789.200, грамматика, 10000, EXPIRED, 5550

3, Johhy Мо, 123456789,200, GK, 10340, АКТИВНЫЙ, 30

7, Джон Доу, 123456789,1500, ГК, 5252, EXPIRED, 30

7, Джон Doe, 12345 6789,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 со строками, а также использовать потоки, это было бы здорово. Благодаря!!

ответ

0

Это решит вашу проблему. Теперь вам просто нужно сменить 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; 
    } 
}); 
+0

Будет ли использоваться это для использования в тысячах пользователей? В этом примере вы просто регистрируете его на консоли, но мне нужно отправить все данные в ответ. –

+0

Если вам не нужен результат для того, чтобы пользователи появлялись в массиве, то я могу изменить его очень эффективно ... –

+0

изменил ответ ... теперь проверьте @ amit-adhikari –

Смежные вопросы