我有這樣的字串:
(Feb 28-Mar 1)
(Mar 2-3)
我希望我回傳一個物件,如下所示,有人給我一些建議我該怎么做?
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)"))
回傳:
[
{
month: 2,
day: 28
},
{
month: 3,
day: 1
}
]
[
{
month: 3,
day: 2
},
{
month: 3,
day: 3
}
]
uj5u.com熱心網友回復:
我會先洗掉括號,然后用/[ -]/. 這樣你就可以得到這兩種形式之一的陣列
["Feb", "28", "Mar", "1"]
要么
["Mar", "2", "3"]
現在如果陣列有 4 個元素,第一個和第三個總是月份,第二個和第四個是天。如果陣列有 3 個元素,第一個是月份,開始和結束,第二個和第三個是天。
為了獲得月份的數字,您可以進行簡單的查找,例如
{ 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]))
uj5u.com熱心網友回復:
你可以試試這個
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)"));
uj5u.com熱心網友回復:
我建議使用正則運算式模式來決議每個跨度。
由此我們可以得到 startMonth、startDay、endMonth、endDay。然后我們可以創建一個getMonthNumber()函式來將縮寫的月份名稱(Jan、Feb 等)轉換為數字。
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 = /\(([a-z]{3})\s (\d{1,2})\-([a-z]{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; }
uj5u.com熱心網友回復:
首先,我們要為幾個月創建一個映射器。像這樣:
let MonthsMapper = new Map([['Jan', 1], ['Feb', 2], ['Mar', 3] /*...*/])
然后我們需要一個函式,它通過洗掉括號并用連字符分割它來將字串分成塊。第一個塊是開始日期和結束日期。通過這兩個日期,我們可以進一步得到開始月份、開始日期、結束月份和結束日期。(通過用空格分割我們的塊)
從您的示例中我只能看到一種特殊情況,即結束日期未指定月份的情況,在這種情況下,它隱含地是開始月份。
let DateObjectParser = (dateString) => {
const [startDate, endDate] = dateString.replace(/[()]/g, '').split('-')
const [startMonth, startDay] = startDate.split(' ')
let [endMonth, endDay] = endDate.split(' ')
// in case a second month is not provided
if (endDay === undefined) {
endDay = endMonth
endMonth = startMonth
}
return [
{
month: MonthsMapper.get(startMonth),
day: parseInt(startDay),
},
{
month: MonthsMapper.get(endMonth),
day: parseInt(endDay),
}
]
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/435893.html
標籤:javascript 细绳 日期
上一篇:根據多個欄位計算年齡
