@editorialapp/datatools
Version:
A collection of dependencies organized into useful tools for working with data in ways that are common in data cleaning and in building news apps.
97 lines (79 loc) • 2.05 kB
JavaScript
import slug from '@sindresorhus/slugify'
export function capitalizeWord (word) {
return word.charAt(0).toUpperCase() + word.substr(1)
}
export function capitalCase (phrase) {
return phrase.split(' ').map((word) => {
return capitalizeWord(word.trim())
}).join(' ')
}
export function slugify (str, options = {}) {
if (!options.separator) {
options.separator = '_'
}
if (!str) {
return str
}
return slug(str, options)
}
export function unslugify (slug, options = {}) {
const { capitalize = true } = options
if (capitalize) {
return capitalCase(slug.replace(/_/g, ' '))
}
return slug.replace(/_/g, ' ')
}
/**
* Convert an object's properties from strings to numbers where appropriate
* @param {Object} [options]
* @param {boolean} [options.convertLeadingZeroStrings=true]
* @returns {Object}
*/
export function convertNumberProperties (obj, options = {}) {
const { convertLeadingZeroStrings = true, exclude = [] } = options
const updatedObj = {}
for (const key in obj) {
const value = obj[key]
if (exclude.includes(key)) {
updatedObj[key] = value
} else if (!value) {
updatedObj[key] = value
} else {
const parsed = parseFloat(value.replace(/,/g, ''))
if (isNaN(parsed)) {
updatedObj[key] = value
} else {
if (Number.isSafeInteger(parsed)) {
if (convertLeadingZeroStrings && value[0] === '0' && value.length > 1) {
updatedObj[key] = value
} else {
updatedObj[key] = parsed
}
} else {
updatedObj[key] = parsed
}
}
}
}
return updatedObj
}
/**
* Convert an object's properties from empty strings to `null`
* @param {Object} obj
* @returns {Object}
*/
export function convertEmptyStringsToNull (obj, options = {}) {
const { exclude = [] } = options
const updatedObj = {}
for (const key in obj) {
const value = obj[key]
if (exclude.includes(key)) {
updatedObj[key] = value
} else if (typeof value === 'string' && !value.length) {
updatedObj[key] = null
} else {
updatedObj[key] = value
}
}
return updatedObj
}