Libraries Underscore.js, underscore.string and Moment.js are loaded and available along with vanilla JavaScript to help you transform and clean data.
In addition, you can validate an email with _.isEmail(email)
. It will return true
or false
.
Moment.js is available in global function moment()
to help you parse and format dates.
// Parse a string as date and verify it's valid moment('2012-01-12').isValid(); // true moment('lorem ipsum').isValid(); // false // Parse a known date format and convert to another format moment('09-12-24', 'YY-MM-DD').format('MMM Do YYYY'); // 'Dec 24th 2009'
By default, the locale loaded is English en
. You can use the locale
method to switch to another language:
// Change to French and parse a date moment.locale('fr'); // Returns 'fr' var d = moment('25 février 2018', 'DD MMM YYYY'); d.isValid(); // true // Format in English d.locale('en'); d.format('LL'); // February 25, 2018
Use _.isEmail(email)
to check if an email is valid.
_.isEmail('jean franç[email protected]') // false _.isEmail('[email protected]') // true
Lots can be done with vanilla JavaScript
// Split a string based on a separator 'Red Sox vs Astros'.split('vs'); // ['Red Sox', 'Astros'] // Split a string based on a case insensitive separator 'Red Sox VS Astros'.split(new RegExp('\\s+' + 'vs' + '\\s+', 'i')); // ['Red Sox', 'Astros'] // Convert to lower case 'RED SOX vs ASTROS'.toLowerCase(); // 'red sox vs astros'
Underscore.string functions are available in the global namespace s
to help you to handle strings.
// Remove diacritics (accents) from a string s.cleanDiacritics('Élévation'); // Elevation // Break a string into an array of words s.words('Hello my friend'); // ['Hello', 'my', 'friend'] // Reformat as an English title s.titlize('RED SOX vs ASTROS'); // 'Red Sox Vs Astros' // Clean a string before comparison s.cleanDiacritics(' Élévation ').toLowerCase().trim() == 'elevation'; // true
Columns are ordered as you create them. For instance, consider this:
// Input [{ "Last Name": "Doe", "Dob": "25 March 2001", "First Name": "John" }] // Process function function process(input, columns) { var output = []; input.forEach(function(inRow, r) { var outRow = {}; outRow['First Name'] = inRow['First Name']; outRow['Last Name'] = inRow['Last Name']; outRow['Dob'] = inRow['Dob']; output.push(outRow); }); return output; } // Output [{ "First Name": "John", "Last Name": "Doe", "Dob": "25 March 2001" }]
Assuming we have this input table:
Id | Holiday | Day of week | Date |
---|---|---|---|
1 | New Year's Day | Tuesday | January 1, 2019 |
2 | Good Friday | Friday | April 19, 2019 |
3 | Easter Monday | Monday | April 22, 2019 |
4 | Victoria Day/National Patriots Day | Monday | May 20, 2019 |
5 | Quebec national Holiday | Monday | June 24, 2019 |
Using Underscore.js's sortBy() function to sort on a column.
Note: This will return a copy of the input array. Hence we need to reassign it.
// Sort by Id in ascending order input = _.sortBy(input, 'Id'); // Sort by Id in desceding order input = _.sortBy(input, function(o) { return -o.Id; }); // Sort by date input = _.sortBy(input, function(o) { return moment(o.Date).unix(); });
To sort by name, alphanumerically, we may combine JavaScript's Array.prototype.sort() method with underscore.string's naturalCmp(string1, string2) function.
Note: In this case the array is sorted in place - no need to reassign it.
input.sort(function(o1, o2) { return s.naturalCmp(o1.Holiday, o2.Holiday); });
If you encounter unfixable data, you can stop processing by throwing an error. For example, if an email is bad:
if (!_.isEmail(inRow.Email)) throw 'Not an email ' + inRow.Email + ' on row ' + r;