Skip to content

Commit 5a8b7e0

Browse files
authored
feat(json2csv): use sort function for sortHeader option (#217)
1 parent 023eec1 commit 5a8b7e0

File tree

6 files changed

+17
-3
lines changed

6 files changed

+17
-3
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ Looking for examples? Check out the Wiki: [json-2-csv Wiki](https://github.com/m
9696
* Note: Using this option may override other options, including `useDateIso8601Format` and `useLocaleFormat`.
9797
* `prependHeader` - Boolean - Should the auto-generated header be prepended as the first line in the CSV?
9898
* Default: `true`
99-
* `sortHeader` - Boolean - Should the header keys be sorted in alphabetical order?
99+
* `sortHeader` - Boolean or Function - Should the header keys be sorted in alphabetical order? or pass a function to use a custom sorting function
100100
* Default: `false`
101101
* `trimFieldValues` - Boolean - Should the field values be trimmed?
102102
* Default: `false`

lib/converter.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ export interface IFullOptions extends ISharedOptions {
8585
* Should the header keys be sorted in alphabetical order
8686
* @default false
8787
*/
88-
sortHeader?: boolean;
88+
sortHeader?: boolean|((a: any, b: any) => number);
8989

9090
/**
9191
* Should array values be "unwound" such that there is one line per value in the array?

lib/json2csv.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ const Json2Csv = function(options) {
103103
*/
104104
function sortHeaderFields(fieldNames) {
105105
if (options.sortHeader) {
106-
return fieldNames.sort();
106+
return typeof options.sortHeader === 'function' ? fieldNames.sort(options.sortHeader) : fieldNames.sort();
107107
}
108108
return fieldNames;
109109
}

test/config/testCsvFilesList.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ const fs = require('fs'),
2727
{key: 'extraLine', file: '../data/csv/extraLine.csv'},
2828
{key: 'noHeader', file: '../data/csv/noHeader.csv'},
2929
{key: 'sortedHeader', file: '../data/csv/sortedHeader.csv'},
30+
{key: 'sortedHeaderCustom', file: '../data/csv/sortedHeaderCustom.csv'},
3031
{key: 'emptyFieldValues', file: '../data/csv/emptyFieldValues.csv'},
3132
{key: 'quotedEmptyFieldValue', file: '../data/csv/quotedEmptyFieldValue.csv'},
3233
{key: 'csvEmptyLastValue', file: '../data/csv/csvEmptyLastValue.csv'},

test/data/csv/sortedHeaderCustom.csv

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
optionalField,object.subField,number,isBoolean,arrayOfStrings
2+
this one has it,subValue,5,true,"[""test1"",""test2""]"
3+
null,subValue,7,false,"[""test3"",""test4""]"

test/json2csv.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,16 @@ function runTests(jsonTestData, csvTestData) {
328328
});
329329
});
330330

331+
it('should sort the header with a custom function in the csv', (done) => {
332+
converter.json2csv(jsonTestData.assortedValues, (err, csv) => {
333+
if (err) done(err);
334+
csv.should.equal(csvTestData.sortedHeaderCustom);
335+
done();
336+
}, {
337+
sortHeader: (a, b) => b.localeCompare(a)
338+
});
339+
});
340+
331341
it('should trim the header fields when specified', (done) => {
332342
converter.json2csv(jsonTestData.trimHeader, (err, csv) => {
333343
if (err) done(err);

0 commit comments

Comments
 (0)