我在localStorage里面儲存用戶信息userInfo,要封裝一個修改userInfo的方法
// userInfof里面有很多信息
var userInfo= {
id:'123',
name:'Jim',
info:{
address:{
home:'地王大廈',
work:{
workDays:'騰訊大廈',
weekend:'阿里巴巴大廈',
festival:'百度大廈',
},
},
money:{
balance:0,// 余額
redPacket:0,// 紅包
integral:0,// 積分
}
}
}
// 比如修改localStorage.userInfo.info.address.work.workDays為京東大廈,則
editFn('userInfo.info.address.work.workDays','京東大廈');
// 比如修改localStorage.userInfo.info.money.balance為888,則
editFn('userInfo.info.money.balance','888');
這個editFn方法改怎么寫?
如果你非要用這種方法來修改的話……,首先要明確一個,就是LocalStorage存儲的是字符串
所以我假設(shè)你的LocalStorage里面存的對象是JSON.stringify()轉(zhuǎn)出的json
function RewriteLS(LSkey,fn){
//Write接收一個回調(diào)函數(shù)作為參數(shù),回調(diào)函數(shù)的參數(shù)為要修改的obj
if(!localStorage[LSkey]){
localStorage[LSkey] = JSON.stringify({});
}
let Obj = JSON.parse(localStorage[LSkey]);//這里應(yīng)當(dāng)先判斷isJSON,我就省略了,懶得寫
Obj = fn(Obj)||Obj; //這里可以隨你return,直接用引用修改的話就不用return了
console.log(Obj);
localStorage[LSkey] = JSON.stringify(Obj)
}
function editFn(path,value){
let pathArr = path.split(".");
RewriteLS(pathArr.splice(0,1),(obj)=>{
try{
eval("obj."+pathArr.join(".")+"=value");
}catch(e){
//中間的path可能出錯。
throw e;
}
})
}
我直接使用了eval來處理賦值,如果你想的話,循環(huán)或者遞歸來resolve路徑也是可以的。
但是你所說的傳遞一個字符串路徑的方式我十分不推薦。
你可以看到我單獨(dú)封裝了一個RewriteLS函數(shù),使用該函數(shù)
RewriteLS("userInfo",obj=>{
//在這里對obj的屬性進(jìn)行處理
});
來處理的話會更加靈活,也更安全。
function editFn(path, value, obj) {
const arr = path.split('.')
const len = arr.length - 1
arr.reduce((cur, key, index) => {
if (!(cur[key]))
throw `${key} 不存在!`
if (index === len) {
cur[key] = value
}
return cur[key]
}, obj)
}
editFn('info.address.work.workDays','京東大廈', userInfo);
這里要求 userInfo 已經(jīng)是解析后的一個 object,因此 path 部分不能再以 userInfo 開頭。
再一次這個沒有處理數(shù)組的情形,需要留意。
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國制造2025”,實(shí)現(xiàn)中華民族偉大復(fù)興的升級產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。