我想將字串拆分為 JSON。下面是一些例子:
Mon, Fri 2:30 pm - 8 pm / Tues 15 am - 2 pm / Weds 1:15 pm - 3:15 am /....
Mon, Weds - Thurs, Sat 7:15 pm - 3:30 am / Tues 4:45 pm - 5 pm / Fri 8:25 am - 9:30 pm / ...
Mon, Weds - Sun 7:15 pm - 3:30 am
Mon - Sun 7:15 pm - 3:30 am
我希望我能從每一行得到 JSON:
[
{
day: Mon,
openning_time: 7:15 pm
closing_time: 3:30 am
},
....
]
我嘗試了很多方法,但仍然無法做到。希望能得到一些想法
uj5u.com熱心網友回復:
在拆分之前,先做一個正則運算式(regex)。在正則運算式的基礎上,您必須拆分此字串運算式并將其轉換為陣列。然后json編碼這個陣列
uj5u.com熱心網友回復:
可能這不是最佳性能解決方案,但您可以理解。最后一部分丟失了,因為我不確定日期符號,所以我把它留給你。基本上你必須實作的是另一個平面圖,它將日期字串拆分為天陣列
const stringToParse =
`Mon, Fri 2:30 pm - 8 pm / Tues 15 am - 2 pm / Weds 1:15 pm - 3:15 am
Mon, Weds - Thurs, Sat 7:15 pm - 3:30 am / Tues 4:45 pm - 5 pm / Fri 8:25 am - 9:30 pm
Mon, Weds - Sun 7:15 pm - 3:30 am
Mon - Sun 7:15 pm - 3:30 am`;
const daysArray = ['Mon', 'Tues', 'Weds', 'Thurs', 'Fri', 'Sat', 'Sun']
const json = stringToParse.split('\n')
.flatMap(line => line.split('/').map(s => s.trim()))
.map(s => {
const [closingType, closing, _,openingType, opening, ...days] = s.split(' ').reverse()
return {
days: days.reverse().join(' '),
openning_time: `${opening} ${openingType}`,
closing_time: `${closing} ${closingType}`
}
})
console.log(json)
uj5u.com熱心網友回復:
假設格式是固定的,只需 split & split...
const weekdays = ['Mon', 'Tues', 'Weds', 'Thurs', 'Fri', 'Sat', 'Sun'];
const split = (str) => str.split('/').flatMap(part => {
const tokens = part.split(new RegExp('(' weekdays.join('|') ')')).map(token => token.trim()).filter(token => token !== '' && token !== ',').flatMap((token, index, arr) => {
if (token === '-') {
const f = weekdays.findIndex(w => w === arr[index - 1]);
const t = weekdays.findIndex(w => w === arr[index 1]);
return weekdays.slice(f 1, t);
} else {
return [token];
}
});
const [openning_time, closing_time] = tokens.pop().split('-').map(t => t.trim());
return tokens.map(day => ({
day,
openning_time,
closing_time
}));
});
console.log(split('Mon, Fri 2:30 pm - 8 pm / Tues 15 am - 2 pm / Weds 1:15 pm - 3:15 am'));
console.log(split('Mon, Weds - Thurs, Sat 7:15 pm - 3:30 am / Tues 4:45 pm - 5 pm / Fri 8:25 am - 9:30 pm'));
console.log(split('Mon, Weds - Sun 7:15 pm - 3:30 am'));
console.log(split('Mon - Sun 7:15 pm - 3:30 am'));
uj5u.com熱心網友回復:
我建議使用String.split()將每個輸入字串拆分為欄位。
完成后,我們將使用正則運算式將每個欄位決議為日期、開放時間和關閉時間,使用String.match().
我們還將創建一個splitDays()函式來將日期范圍Mon, Weds - Thurs轉換為日期陣列[Mon,Weds,Thurs],這將允許我們創建最終結果。
function splitDays(days) {
return days.split(',').flatMap(splitDayRange);
}
function splitDayRange(range) {
const days = ['Mon', 'Tues', 'Weds', 'Thurs', 'Fri', 'Sat', 'Sun'];
const [startIndex, endIndex] = range.trim().split(/\s*\-\s*/).map(day => days.findIndex(d => d === day));
return days.filter((day, idx, arr) => {
return (idx >= startIndex) && (idx <= (endIndex || startIndex));
});
}
function parseInput(input) {
const parseRegEx = /([a-z\s\,\-]*)(\d :?\d* (?:am|pm))\s*\-\s*(\d :?\d*\s*(am|pm))/i
return input.split(/\s*\/\s*/).flatMap(field => {
const [, days, opening_time, closing_time ] = field.match(parseRegEx);
return splitDays(days).map(day => {
return { day, opening_time, closing_time };
})
});
}
let inputs = [
'Mon, Fri 2:30 pm - 8 pm / Tues 15 am - 2 pm / Weds 1:15 pm - 3:15 am',
'Mon, Weds - Thurs, Sat 7:15 pm - 3:30 am / Tues 4:45 pm - 5 pm / Fri 8:25 am - 9:30 pm',
'Mon, Weds - Sun 7:15 pm - 3:30 am',
'Mon - Sun 7:15 pm - 3:30 am'
]
for(let input of inputs) {
console.log('Input:');
console.log(input);
console.log('Output:');
console.log(parseInput(input));
}
.as-console-wrapper { max-height: 100% !important; }
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/454232.html
標籤:javascript 细绳 分裂
