JSFiddle - React, Tailwind, and code Playground
by joplomacedo
JavaScript
const convertUnit= ( () => {
function splitIntoNumAndUnit( numAndUnit ) {
let fromNum = '';
let fromUnit = '';
numAndUnit.split('').forEach( v => {
if ( !isNaN(+v) ) {
fromNum += v;
} else {
fromUnit += v;
}
})
fromNum = fromNum;
return [ fromNum, fromUnit ]
}
const minToMax = [
{ m: 1, unit: 'ms' },
{ m: 1000, unit: 's' },
{ m: 60, unit: 'm' },
{ m: 60, unit: 'h' },
{ m: 24, unit: 'd' }
]
const unitsAliases = {
'ms': ['millisecs', 'millisecs', 'millisecond', 'milliseconds'],
's': ['secs', 'sec', 'second', 'seconds'],
'm': ['min', 'mins', 'minute', 'minutes'],
'h': ['hour', 'hours'],
'd': ['day', 'days'],
};
function getUnitFromInputUnit( inputUnit ) {
for ( const [unit, unitAliases] of Object.entries(unitsAliases) ) {
if ( [unit, ...unitAliases].includes(inputUnit) ) {
return unit;
}
}
return null;
}
return function (fromNumAndUnit, _toUnit) {
const [ fromNum, _fromUnit ] = splitIntoNumAndUnit(fromNumAndUnit);
const toUnit = getUnitFromInputUnit(_toUnit);
const fromUnit = getUnitFromInputUnit(_fromUnit);
if ( isNaN(+fromNum) || !toUnit || !fromUnit ) {
console.error('convertUnit called with invalid inputs!')
return;
}
const fromUnitIdx = minToMax.findIndex( ({unit}) => unit === fromUnit );
const toUnitIdx = minToMax.findIndex( ({unit}) => unit === toUnit );
const [startIdx, endIdx] = [fromUnitIdx, toUnitIdx].sort().map( v => v + 1 )
const multiplier = minToMax.slice(startIdx, endIdx).reduce( (res, {m}) => res * m, 1);
if ( fromUnitIdx > toUnitIdx ) {
return fromNum * multiplier;
} else {
return fromNum /...