最近在寫代碼的時候在
React
的對象數組的State
數據感受不是很方便,因此在在使用了其餘方式來解決這個問題。javascript
flatten state
目的是就是把數據扁平化,更加方便咱們對數據的操做,flatten
就是相似於使用HashMap
的形式,在JavaScript
中咱們可使用Object
。java
在這裏咱們以React爲例子,在ReactHooks
中咱們常常對數據進行操做,可是若是操做的是一個對象數組而且該數組很是大這樣時很耗時的,代碼也很冗餘,因此咱們能夠考慮把數組轉化成爲flattenState的形式。redux
exp數組
const initState = [
{id: 1, name: 'RMA', champion: 13},
{id: 2, name: 'ACM', champion: 7},
{id: 3, name: 'MUN', champion: 4},
{id: 4, name: 'ARS', champion: 0}
]
const [teams, setTeams] = useState()
複製代碼
對於這樣的數據若是咱們須要查找某一個數據或者修改某一個數據時對應的時間複雜度爲O(n)
,由於咱們每次對數據進行操做都須要循環遍歷一次數組。ui
// 刪除一項
const deleteData = (id) => {
return teams.filter(item => item.id !== id)
}
const newTeams = deleteData(3)
setTeams(newTeams)
// 修改一項
const modifyData = (id, val) => {
return teams.map(item => {
if(item.id === id) { // tips:item爲引用值能夠改變
item.champion = val
}
return item
})
}
const newData = modifyData(4, 1)
setTeams(newData)
// 查找一項
const findData = (id) => {
return teams.find(item => item.id === id)
}
複製代碼
在咱們熟悉使用數組的一些高階方法以後操做起來仍是比較方便的,可是若是數據量過大每次循環仍是很耗時的。有沒有更好的方法呢?固然就是使用flattenState
(Object
)來解決。spa
上面的數據有一個特色就是每個數據項都具體有惟一的標識符(id
),在上面的例子中咱們在查找某一個數據項的時候使用的該惟一標識符。code
因此咱們能夠思考在查找某個特定的數據的時候不須要再經過循環遍歷每一項而後使用每一項的id
和特定id
對比,我但願能夠直接訪問id就可以訪問到其對應的數據不須要再使用循環了,可以作到這樣能力就是對象(object
)。orm
因此咱們須要將上面的形式轉化爲下面這樣的對象
const flattenState = {
1: {id: 1, name: 'RMA', champion: 13},
2: {id: 2, name: 'ACM', champion: 7},
3: {id: 3, name: 'MUN', champion: 4},
4: {id: 4, name: 'ARS', champion: 0}
}
複製代碼
上面這一種形式就是使用惟一的id
來做爲鍵值對的鍵,把上面數組的某一項做爲鍵值對的值。ip
對數據操做
// 刪除
const deleteData = (id) => {
delete flattenState[id]
setTeams(flattenState)
}
// 修改id爲'1'的
const modifyData = (id, val) => {
const newTeam = {...Teams[id], champion: val}
setTeams({...teams, [id]: newTeam})
}
// 查詢
const findData = (id) => {
return teams[id]
}
複製代碼
這樣就方便許多了,咱們在操做數據的時候就不須要循環了因此時間複雜度變味了O(1)
,思路也更加清晰了,代碼也沒有之前那麼多了。
數組轉化爲flattenState
const converseArrToObj = (arr) => {
return arr.reduce((obj, item) => {
obj[item.id] = item
return obj
}, {})
}
複製代碼
flattenState轉化爲數組
const converseObjToArr = (obj) => {
const keys = Object.keys(obj)
return keys.map(key => {
return obj[key]
})
}
複製代碼
你們所熟知的Redux
就是使用的該方式:Normalizing State Shape,你們有興趣能夠看看。
今天的文章就到這裏了,你們晚安。。。