From c436942b4e7c5794e42d9cc187aad17ed8bc04fa Mon Sep 17 00:00:00 2001 From: Ilya Radchenko Date: Mon, 11 Jul 2016 19:59:00 -0400 Subject: [PATCH] Return all fields when not setting `fields` param Fixes #104 --- lib/json2csv.js | 17 +++++++++++++++-- package.json | 2 ++ test/fixtures/csv/default.csv | 10 +++++----- test/fixtures/json/default.json | 2 +- test/index.js | 2 +- 5 files changed, 24 insertions(+), 9 deletions(-) diff --git a/lib/json2csv.js b/lib/json2csv.js index 6be63b1a..7c704c95 100644 --- a/lib/json2csv.js +++ b/lib/json2csv.js @@ -3,6 +3,8 @@ */ var os = require('os'); var lodashGet = require('lodash.get'); +var lodashFlatten = require('lodash.flatten'); +var lodashUniq = require('lodash.uniq'); var flatten = require('flat'); /** @@ -17,8 +19,8 @@ var flatten = require('flat'); */ module.exports = function (params, callback) { var hasCallback = typeof callback === 'function'; - var err; + try { checkParams(params); } catch (err) { @@ -30,8 +32,10 @@ module.exports = function (params, callback) { throw err; } } + var titles = createColumnTitles(params); var csv = createColumnContent(params, titles); + if (hasCallback) { return process.nextTick(function () { callback(null, csv); @@ -67,7 +71,16 @@ function checkParams(params) { if (!params.fields && (params.data.length === 0 || typeof params.data[0] !== 'object')) { throw new Error('params should include "fields" and/or non-empty "data" array of objects'); } - params.fields = params.fields || Object.keys(params.data[0]); + + if (!params.fields) { + var dataFields = params.data.map(function (item) { + return Object.keys(item); + }); + + dataFields = lodashFlatten(dataFields); + params.fields = lodashUniq(dataFields); + debugger; + } //#check fieldNames diff --git a/package.json b/package.json index 9fac7525..8aa858e1 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,9 @@ "commander": "^2.8.1", "debug": "^2.2.0", "flat": "^2.0.0", + "lodash.flatten": "^4.2.0", "lodash.get": "^4.3.0", + "lodash.uniq": "^4.3.0", "path-is-absolute": "^1.0.0" }, "devDependencies": { diff --git a/test/fixtures/csv/default.csv b/test/fixtures/csv/default.csv index bf2246de..5356fb4b 100644 --- a/test/fixtures/csv/default.csv +++ b/test/fixtures/csv/default.csv @@ -1,5 +1,5 @@ -"carModel","price","color" -"Audi",0,"blue" -"BMW",15000,"red" -"Mercedes",20000,"yellow" -"Porsche",30000,"green" \ No newline at end of file +"carModel","price","color","transmission" +"Audi",0,"blue", +"BMW",15000,"red","manual" +"Mercedes",20000,"yellow", +"Porsche",30000,"green", \ No newline at end of file diff --git a/test/fixtures/json/default.json b/test/fixtures/json/default.json index b7e17af8..75dcdd2b 100644 --- a/test/fixtures/json/default.json +++ b/test/fixtures/json/default.json @@ -1,6 +1,6 @@ [ { "carModel": "Audi", "price": 0, "color": "blue" }, - { "carModel": "BMW", "price": 15000, "color": "red" }, + { "carModel": "BMW", "price": 15000, "color": "red", "transmission": "manual" }, { "carModel": "Mercedes", "price": 20000, "color": "yellow" }, { "carModel": "Porsche", "price": 30000, "color": "green" } ] diff --git a/test/index.js b/test/index.js index 34d01335..2b79ca54 100644 --- a/test/index.js +++ b/test/index.js @@ -74,7 +74,7 @@ async.parallel(loadFixtures(csvFixtures), function (err) { test('should parse json to csv', function (t) { json2csv({ data: jsonDefault, - fields: ['carModel', 'price', 'color'] + fields: ['carModel', 'price', 'color', 'transmission'] }, function (error, csv) { t.error(error); t.equal(csv, csvFixtures.default);