parseStyles
輸入:javascript
'padding-left:20; display: flex; flex-direction: row; margin-right:20'
java
輸出:react
{
display: "flex"
flexDirection: "row"
marginRight: "20"
paddingLeft: "20"
}
複製代碼
const parseStyles = (styles: string = ''): { [key: string]: string } => {
return styles
.split(';')
.filter((style) => style.split(':').length === 2)
.map((style) => [
style.split(':')[0].trim().replace(/-./g, c => c.substr(1).toUpperCase()),
style.split(':')[1].trim()
])
.reduce((styleObj, style) => ({
...styleObj,
[style[0]]: style[1],
}), {})
}
複製代碼
使用的是TypeScript
, 其中parseStyles
函數傳入一個參數styles
, 類型是字符串string
, 函數的返回值是一個對象, 對象的屬性名key
類型屬於字符串, 對象屬性值類型爲string
git
(styles: string = ''): { [key: string]: string }
複製代碼
其中styles
默認值是''
空字符串github
styles
.split(';')
// ["padding-left:20", " display: flex", " flex-direction: row", " margin-right:20"]
複製代碼
styles
.split(';')
.filter((style) => style.split(':').length === 2)
// ["padding-left:20", " display: flex", " flex-direction: row", " margin-right:20"]
複製代碼
styles
.split(';')
.filter((style) => style.split(':').length === 2)
.map((style) => [
style.split(':')[0].trim().replace(/-./g, c => c.substr(1).toUpperCase()),
style.split(':')[1].trim()
])
[
['paddingLeft', '20'],
['display', 'flex']
['flexDirection', 'row'],
['marginRight', '20']
]
複製代碼
styles
.split(';')
.filter((style) => style.split(':').length === 2)
.map((style) => [
style.split(':')[0].trim().replace(/-./g, c => c.substr(1).toUpperCase()),
style.split(':')[1].trim()
])
.reduce((styleObj, style) => ({
...styleObj,
[style[0]]: style[1],
}), {})
{
display: "flex"
flexDirection: "row"
marginRight: "20"
paddingLeft: "20"
}
複製代碼
reduce
函數,2
個參數,第一個是函數,第二個默認值。react-native
其中函數有4
個參數,第一個參數是累積器, 第二個參數遍歷的當前值, 第三個參數是當前索引, 第四個參數是源數組數組
最重要的是第一個參數累積器, 當第一次循環的時候,參數值爲['paddingLeft', '20']
, 第二次循環的時候,參數值是什麼,取決於函數返回值,若是返回值是累加,即跟第二個參數累加,那第二次循環,值爲累加值。bash
這裏用到reduce
函數的第二個參數,默認值,即第一次循環的時候,函數的第一個參數的值爲你設置的默認值,而不是數組裏的第0
項函數
回過頭來看這段代碼flex
reduce((styleObj, style) => ({
...styleObj,
[style[0]]: style[1],
}), {})
複製代碼
第1
次循環時styleObj
爲默認值{}
, 函數返回的是
{
display: "flex"
}
複製代碼
第2
次循環時styleObj
爲默認值{display: "flex"}
, 函數返回的是
{
display: "flex",
flexDirection: "row"
}
複製代碼
...
以此類推最後返回
{
display: "flex"
flexDirection: "row"
marginRight: "20"
paddingLeft: "20"
}
複製代碼
在編寫react-native
應用會有這樣的需求