UNPKG

terriajs

Version:

Geospatial data visualization platform.

60 lines (54 loc) 1.85 kB
'use strict'; /** * Combines two data arrays, each with the format [[x1, y1], [x2, y2], ...] * maintaining the order of the x's. * The x and y can be anything with order (integers, floats, dates, etc) * @param {Array} array Array of arrays, eg. [[[x1, y1], [x2, y2]], [[a1, b1], [a2, b2]]] * @return {Number[]|Date[]} Combined array. */ function combineData(arrays) { // This implementation works, but could be streamlined. var numArrays = arrays.length; if (numArrays === 1) { return arrays[0]; } var expandedArrays = arrays.map(function(array, arrayIndex) { return array.map(function(a) { var element = nullArray(numArrays + 1); element[0] = a[0]; element[arrayIndex + 1] = a[1]; return element; }); }); var result = Array.prototype.concat.apply([], expandedArrays); result.sort(compareFunction); for (var i = result.length - 2; i >= 0; i--) { if (compareFunction(result[i], result[i + 1]) === 0) { // merge the two rows and delete the old one result[i] = mergeElements(result[i], result[i + 1]); result.splice(i + 1, 1); } } return result; } function compareFunction(a, b) { return a[0] - b[0]; // should be the same as: // if (a[0] < b[0]) { // return -1; // } // if (a[0] > b[0]) { // return 1; // } // return 0; } function nullArray(len) { return Array.apply(null, new Array(len)).map(function() { return null; }); } function mergeElements(e, f) { // eg. e = [1, null, null, 0] and f = [1, 15, null, null] should give [1, 15, null, 0] return e.map(function(a, i) { return (a === null ? f[i] : a); }); } module.exports = combineData;