From 5a8b7e038b72531dbf39e6c091017ccfbfe6efc8 Mon Sep 17 00:00:00 2001 From: Guillaume Date: Sat, 15 Jan 2022 02:32:30 +0100 Subject: [PATCH] feat(json2csv): use sort function for `sortHeader` option (#217) --- README.md | 2 +- lib/converter.d.ts | 2 +- lib/json2csv.js | 2 +- test/config/testCsvFilesList.js | 1 + test/data/csv/sortedHeaderCustom.csv | 3 +++ test/json2csv.js | 10 ++++++++++ 6 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 test/data/csv/sortedHeaderCustom.csv diff --git a/README.md b/README.md index 4d2843a..4f84c5e 100755 --- a/README.md +++ b/README.md @@ -96,7 +96,7 @@ Looking for examples? Check out the Wiki: [json-2-csv Wiki](https://github.com/m * Note: Using this option may override other options, including `useDateIso8601Format` and `useLocaleFormat`. * `prependHeader` - Boolean - Should the auto-generated header be prepended as the first line in the CSV? * Default: `true` - * `sortHeader` - Boolean - Should the header keys be sorted in alphabetical order? + * `sortHeader` - Boolean or Function - Should the header keys be sorted in alphabetical order? or pass a function to use a custom sorting function * Default: `false` * `trimFieldValues` - Boolean - Should the field values be trimmed? * Default: `false` diff --git a/lib/converter.d.ts b/lib/converter.d.ts index 833ed5b..df9834b 100644 --- a/lib/converter.d.ts +++ b/lib/converter.d.ts @@ -85,7 +85,7 @@ export interface IFullOptions extends ISharedOptions { * Should the header keys be sorted in alphabetical order * @default false */ - sortHeader?: boolean; + sortHeader?: boolean|((a: any, b: any) => number); /** * Should array values be "unwound" such that there is one line per value in the array? diff --git a/lib/json2csv.js b/lib/json2csv.js index 5d1d274..2b9c6aa 100755 --- a/lib/json2csv.js +++ b/lib/json2csv.js @@ -103,7 +103,7 @@ const Json2Csv = function(options) { */ function sortHeaderFields(fieldNames) { if (options.sortHeader) { - return fieldNames.sort(); + return typeof options.sortHeader === 'function' ? fieldNames.sort(options.sortHeader) : fieldNames.sort(); } return fieldNames; } diff --git a/test/config/testCsvFilesList.js b/test/config/testCsvFilesList.js index 78edcb0..64d7ac6 100644 --- a/test/config/testCsvFilesList.js +++ b/test/config/testCsvFilesList.js @@ -27,6 +27,7 @@ const fs = require('fs'), {key: 'extraLine', file: '../data/csv/extraLine.csv'}, {key: 'noHeader', file: '../data/csv/noHeader.csv'}, {key: 'sortedHeader', file: '../data/csv/sortedHeader.csv'}, + {key: 'sortedHeaderCustom', file: '../data/csv/sortedHeaderCustom.csv'}, {key: 'emptyFieldValues', file: '../data/csv/emptyFieldValues.csv'}, {key: 'quotedEmptyFieldValue', file: '../data/csv/quotedEmptyFieldValue.csv'}, {key: 'csvEmptyLastValue', file: '../data/csv/csvEmptyLastValue.csv'}, diff --git a/test/data/csv/sortedHeaderCustom.csv b/test/data/csv/sortedHeaderCustom.csv new file mode 100644 index 0000000..796e33b --- /dev/null +++ b/test/data/csv/sortedHeaderCustom.csv @@ -0,0 +1,3 @@ +optionalField,object.subField,number,isBoolean,arrayOfStrings +this one has it,subValue,5,true,"[""test1"",""test2""]" +null,subValue,7,false,"[""test3"",""test4""]" \ No newline at end of file diff --git a/test/json2csv.js b/test/json2csv.js index d2cebd9..22cef1d 100644 --- a/test/json2csv.js +++ b/test/json2csv.js @@ -328,6 +328,16 @@ function runTests(jsonTestData, csvTestData) { }); }); + it('should sort the header with a custom function in the csv', (done) => { + converter.json2csv(jsonTestData.assortedValues, (err, csv) => { + if (err) done(err); + csv.should.equal(csvTestData.sortedHeaderCustom); + done(); + }, { + sortHeader: (a, b) => b.localeCompare(a) + }); + }); + it('should trim the header fields when specified', (done) => { converter.json2csv(jsonTestData.trimHeader, (err, csv) => { if (err) done(err);