Skip to content

Commit 9875ca2

Browse files
committed
Fix for zgrossbart#3
Adds an option to ignore the order of elements in arrays by recursively sorting arrays in the JSON object
1 parent eb0c51b commit 9875ca2

File tree

5 files changed

+80
-3
lines changed

5 files changed

+80
-3
lines changed

index-test.html

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,13 @@ <h3>The semantic JSON compare tool</h3>
6161
</div>
6262

6363
<div class="center">
64+
<input type="checkbox" name="ignore-array-order" id="ignore-array-order" />
65+
<label for="ignore-array-order">Ignore array order <br /> (this will sort arrays before comparing). </label><br />
66+
<br/>
6467
<button id="compare">Compare</button>
6568
<div class="throbber-loader"></div>
6669
<br/><br/><br/><br/>
6770
or try some <a href="#" id="sample">sample data</a>
68-
6971
</div>
7072

7173
<div class="right">

index.html

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,13 @@ <h3>The semantic JSON compare tool</h3>
5757
</div>
5858

5959
<div class="center">
60+
<input type="checkbox" name="ignore-array-order" id="ignore-array-order" />
61+
<label for="ignore-array-order">Ignore array order <br /> (this will sort arrays before comparing). </label><br />
62+
<br/>
6063
<button id="compare">Compare</button>
6164
<div class="throbber-loader"></div>
6265
<br/><br/><br/><br/>
6366
or try some <a href="#" id="sample">sample data</a>
64-
6567
</div>
6668

6769
<div class="right">

jdd.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ div.center {
9999
display: inline-block;
100100
vertical-align: top;
101101
text-align: left;
102-
margin-top: 20%;
102+
margin-top: 10%;
103103
margin-left: 2%;
104104
}
105105

jdd.js

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -956,6 +956,11 @@ var jdd = {
956956
var left = JSON.parse($('#textarealeft').val());
957957
var right = JSON.parse($('#textarearight').val());
958958

959+
// if ignore order, then sort arrays
960+
if ($('#ignore-array-order').is(':checked')) {
961+
jdd.sortArrays(left);
962+
jdd.sortArrays(right);
963+
}
959964

960965
var config = jdd.createConfig();
961966
jdd.formatAndDecorate(config, left);
@@ -1000,6 +1005,43 @@ var jdd = {
10001005

10011006
},
10021007

1008+
/**
1009+
* For JSON objects a and b, convert objects to string and compare
1010+
*/
1011+
jsonComparator: function jsonComparator(a,b) {
1012+
var aStr = JSON.stringify(a);
1013+
var bStr = JSON.stringify(b);
1014+
if (aStr > bStr) {
1015+
return 1;
1016+
}
1017+
else if (aStr < bStr) {
1018+
return -1;
1019+
}
1020+
else {
1021+
return 0;
1022+
}
1023+
},
1024+
1025+
/**
1026+
* recursively sort arrays contained in the JSON object jsonData
1027+
*/
1028+
sortArrays: function(jsonData) {
1029+
var dataType = $.type(jsonData);
1030+
if (dataType === "array") {
1031+
for (var i = 0; i < jsonData.length; i++) {
1032+
jdd.sortArrays(jsonData[i]);
1033+
}
1034+
jsonData.sort(jdd.jsonComparator);
1035+
}
1036+
else if (dataType === "object") {
1037+
for (var p in jsonData) {
1038+
if (jsonData.hasOwnProperty(p)) {
1039+
jdd.sortArrays(jsonData[p]);
1040+
}
1041+
}
1042+
}
1043+
},
1044+
10031045
/**
10041046
* Load in the sample data
10051047
*/

jdd_test.js

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,37 @@ QUnit.test( 'Object to array compare tests', function( assert ) {
120120
jdd.setupNewDiff();
121121
});
122122

123+
QUnit.test( 'Arrays order test', function( assert ) {
124+
$('#textarealeft').val('{"a": [1,2,3],"b":"abc"}');
125+
$('#textarearight').val('{"b":"abc","a": [1,3,2]}');
126+
127+
jdd.compare();
128+
129+
// This test makes sure there wasn't a parsing error
130+
assert.ok(jdd.diffs.length > 0, 'Checking for parsing errors' );
131+
132+
assert.ok(jdd.diffs.length === 2, 'Checking for the correct number of differences' );
133+
134+
assert.ok(jdd.diffs[0].type === jdd.EQUALITY, 'Checking incorrect type' );
135+
136+
$('#textarealeft').val('');
137+
$('#textarearight').val('');
138+
jdd.setupNewDiff();
139+
});
140+
141+
QUnit.test( 'Arrays ignore order test', function( assert ) {
142+
$('#textarealeft').val('{"a": [1,2,3],"b":"abc"}');
143+
$('#textarearight').val('{"b":"abc","a": [1,3,2]}');
144+
$('#ignore-array-order').prop('checked', true);
145+
146+
jdd.compare();
147+
148+
assert.ok(jdd.diffs.length === 0, 'Checking for the correct number of differences' );
149+
150+
$('#textarealeft').val('');
151+
$('#textarearight').val('');
152+
jdd.setupNewDiff();
153+
});
123154

124155
QUnit.done(function() {
125156
$('div.initContainer').hide();

0 commit comments

Comments
 (0)