Skip to content

Commit ec62bfa

Browse files
authored
Merge pull request #48 from hparkertt/master
Adding undefined/null check for `container.lat` scenarios.
2 parents 5ac5d62 + 2bdf727 commit ec62bfa

3 files changed

Lines changed: 67 additions & 14 deletions

File tree

geojson.js

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,9 @@
180180

181181
for(var gtype in params.geom) {
182182
var val = params.geom[gtype];
183+
var coordinates = [];
184+
var itemClone;
185+
var paths;
183186

184187
// Geometry parameter specified as: {Point: 'coords'}
185188
if(typeof val === 'string' && item.hasOwnProperty(val)) {
@@ -225,12 +228,11 @@
225228

226229
// Geometry parameter specified as: {Point: ['container.lat', 'container.lng', 'container.alt']}
227230
else if(Array.isArray(val) && isNested(val[0]) && isNested(val[1]) && isNested(val[2])){
228-
var coordinates = [];
229231
for (var i = 0; i < val.length; i++) { // i.e. 0 and 1
230-
var paths = val[i].split('.');
231-
var itemClone = item;
232+
paths = val[i].split('.');
233+
itemClone = item;
232234
for (var j = 0; j < paths.length; j++) {
233-
if (!itemClone.hasOwnProperty(paths[j])) {
235+
if (itemClone == undefined || !itemClone.hasOwnProperty(paths[j])) {
234236
return false;
235237
}
236238
itemClone = itemClone[paths[j]]; // Iterate deeper into the object
@@ -243,17 +245,16 @@
243245

244246
// Geometry parameter specified as: {Point: ['container.lat', 'container.lng']}
245247
else if(Array.isArray(val) && isNested(val[0]) && isNested(val[1])){
246-
var coordinates = [];
247-
for (var i = 0; i < val.length; i++) { // i.e. 0 and 1
248-
var paths = val[i].split('.');
249-
var itemClone = item;
250-
for (var j = 0; j < paths.length; j++) {
251-
if (!itemClone.hasOwnProperty(paths[j])) {
248+
for (var k = 0; k < val.length; k++) { // i.e. 0 and 1
249+
paths = val[k].split('.');
250+
itemClone = item;
251+
for (var l = 0; l < paths.length; l++) {
252+
if (itemClone == undefined || !itemClone.hasOwnProperty(paths[l])) {
252253
return false;
253254
}
254-
itemClone = itemClone[paths[j]]; // Iterate deeper into the object
255+
itemClone = itemClone[paths[l]]; // Iterate deeper into the object
255256
}
256-
coordinates[i] = itemClone;
257+
coordinates[k] = itemClone;
257258
}
258259
geom.type = gtype;
259260
geom.coordinates = [Number(coordinates[1]), Number(coordinates[0])];

geojson.min.js

Lines changed: 3 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/test.js

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -481,6 +481,57 @@ describe('GeoJSON', function() {
481481
});
482482
});
483483

484+
it('can accept nested arguments for Point', function(done) {
485+
var data = [
486+
{ name: 'Location A', category: 'Store', location: { point: { lat: 39.984, lng: -75.343 } } }
487+
];
488+
489+
GeoJSON.parse(data, { Point: ['location.point.lat', 'location.point.lng'] }, function(geojson) {
490+
expect(geojson.type).to.be('FeatureCollection');
491+
expect(geojson.features).to.be.an('array');
492+
expect(geojson.features.length).to.be(1);
493+
expect(geojson.features[0].geometry.coordinates[0]).to.equal(-75.343);
494+
expect(geojson.features[0].geometry.coordinates[1]).to.equal(39.984);
495+
done();
496+
});
497+
});
498+
499+
it('can handle null or undefined values when parsing nested arguments', function(done) {
500+
var data = [
501+
{ geo: null },
502+
{ geo: { line: [[102.0, 0.0], [103.0, 1.0], [104.0, 0.0], [105.0, 1.0] ] } },
503+
{ geo: { polygon: [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0] ] } },
504+
{ geo: { multipoint: [ [100.0, 0.0], [101.0, 1.0] ] } },
505+
{ geo: { multipolygon: [
506+
[[[102.0, 2.0], [103.0, 2.0], [103.0, 3.0], [102.0, 3.0], [102.0, 2.0]]],
507+
[[[100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0]],
508+
[[100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2]]]
509+
]}},
510+
{ geo: { multilinestring: [ [ [100.0, 0.0], [101.0, 1.0] ], [ [102.0, 2.0], [103.0, 3.0] ] ] } }
511+
];
512+
513+
GeoJSON.parse(data, {
514+
Point: ['geo.nope.point.lng', 'geo.nope.point.lat'],
515+
LineString: 'geo.nope.line',
516+
Polygon: 'geo.nope.polygon',
517+
MultiPoint: 'geo.nope.multipoint',
518+
MultiPolygon: 'geo.nope.multipolygon',
519+
MultiLineString: 'geo.nope.multilinestring'
520+
}, function(geojson) {
521+
expect(geojson.type).to.be('FeatureCollection');
522+
expect(geojson.features).to.be.an('array');
523+
expect(geojson.features.length).to.be(6);
524+
expect(geojson.features[0].geometry).to.be(false);
525+
expect(geojson.features[1].geometry).to.be(false);
526+
expect(geojson.features[2].geometry).to.be(false);
527+
expect(geojson.features[3].geometry).to.be(false);
528+
expect(geojson.features[4].geometry).to.be(false);
529+
expect(geojson.features[5].geometry).to.be(false);
530+
done();
531+
});
532+
533+
});
534+
484535
it('can accept up to three arguments for Point in a nested structure', function(done) {
485536
var data = [
486537
{ name: 'Location A', category: 'Store', location: { lat: 39.984, lng: -75.343, alt: 22026.46 }, street: 'Market' },

0 commit comments

Comments
 (0)