Tengo cadenas como esta:
(Feb 28-Mar 1) (Mar 2-3)Me gustaria que me devuelvan un objeto como se puede ver a continuacion, alguien que me de alguna sugerencia como puedo hacer?
function rD(text){ let date = text.replace('(', '').replace(')', '').split(' '); //const [start, end] = date[2].split("-").map(Number); return date; } console.log(rD("(Feb 28-Mar 1)")) console.log(rD("(Mar 2-3)"))Devolver:
[ { month: 2, day: 28 }, { month: 3, day: 1 } ] [ { month: 3, day: 2 }, { month: 3, day: 3 } ]Quitaría los paréntesis primero y luego los dividiría por /[ -]/ . De esta manera obtienes una matriz en una de estas dos formas.
["Feb", "28", "Mar", "1"]o
["Mar", "2", "3"]Ahora, si la matriz tiene 4 elementos, el primero y el tercero son siempre el mes y el segundo y el siguiente son el día. Si la matriz tiene 3 elementos, el primero es un mes tanto para el inicio como para el final, el segundo y el tercero son los días.
Para obtener el número del mes, puede realizar una búsqueda simple como
{ Jan:1, Feb:2, ... } let months = { Jan: 1, Feb: 2, Mar: 3 /* you get the idea*/} let spans = ["(Jan 28 - Feb 3)", "(Mar 1-3)"] let parse = (span) => { let parts = span.replace(/[()]/g, "").split(/[ -]/).filter(x => !!x); switch (parts.length) { case 4: return [{month: months[parts[0]], date: +parts[1]}, {month: months[parts[2]], date: +parts[3]}]; case 3: return [{month: months[parts[0]], date: +parts[1]}, {month: months[parts[0]], date: +parts[2]}]; default: return undefined; } } console.log(parse(spans[0])); console.log(parse(spans[1]))Sugeriría usar un patrón de expresiones regulares para analizar cada tramo.
De esto podemos obtener startMonth, startDay, endMonth, endDay. Luego podemos crear una función getMonthNumber() para convertir el nombre del mes abreviado (enero, febrero, etc.) en un número.
function getMonthNumber(month) { const lookup = { jan: 01, feb: 02, mar: 03, apr: 04, may: 05, jun: 06, jul: 07, aug: 08, sep: 09, oct: 10, nov: 11, dec: 12}; return lookup[(month + '').toLowerCase()] } function parseSpan(str) { const pattern = /\(([az]{3})\s+(\d{1,2})\-([az]{3})?\s?(\d{1,2})\)/i const [, startMonth, startDay, endMonth, endDay] = str.match(pattern); return [ { month: getMonthNumber(startMonth), day: +startDay }, { month: getMonthNumber(endMonth || startMonth), day: +endDay } ]; } let testInputs = [ '(Feb 28-Mar 1)', '(Mar 2-3)', '(Sep 28-Oct 31)', '(Jan 3-17)' ] testInputs.map(parseSpan).forEach(span => console.log(span)) .as-console-wrapper { max-height: 100% !important; }Puedes probar esto
function rangeCalcFunc(range = null) { if(range && range.length){ const [start, end] = range.substring(1, range.length-1).split("-"); console.log(start);console.log(end); const [startMon, startDt] = start.split(" "); const [endMon, endDt] = end.split(" "); return [ { month: calcMonthInNumber(startMon.trim()), date: startDt }, { month: calcMonthInNumber(endMon.trim()), date: endDt } ] } } function calcMonthInNumber(month) { switch(month.toLowerCase()){ case 'jan': return '01' case 'feb': return '02' //add for other months default: break; } } console.log(rangeCalcFunc("(Jan 28-Feb 1)"));