我在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
存儲的是字符串
所以我假設你的LocalStorage
里面存的對象是JSON.stringify()
轉出的json
function RewriteLS(LSkey,fn){
//Write接收一個回調函數(shù)作為參數(shù),回調函數(shù)的參數(shù)為要修改的obj
if(!localStorage[LSkey]){
localStorage[LSkey] = JSON.stringify({});
}
let Obj = JSON.parse(localStorage[LSkey]);//這里應當先判斷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路徑也是可以的。
但是你所說的傳遞一個字符串路徑的方式我十分不推薦。
你可以看到我單獨封裝了一個RewriteLS
函數(shù),使用該函數(shù)
RewriteLS("userInfo",obj=>{
//在這里對obj的屬性進行處理
});
來處理的話會更加靈活,也更安全。
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
已經是解析后的一個 object
,因此 path
部分不能再以 userInfo
開頭。
再一次這個沒有處理數(shù)組的情形,需要留意。
北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據專業(yè)的國家
北大青鳥中博軟件學院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網學院和江蘇省首批服務外包人才培訓基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團創(chuàng)建于1999年,經過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術與教育服務機構,發(fā)展為教育服務業(yè)的綜合性企業(yè)集團,成為集合面授教學培訓、網
達內教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構,是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
浪潮集團項目經理。精通Java與.NET 技術, 熟練的跨平臺面向對象開發(fā)經驗,技術功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經理從事移動互聯(lián)網管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經理職務負責iOS教學及管理工作。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網頁制作和網頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經驗。曾經歷任德國Software AG 技術顧問,美國Dachieve 系統(tǒng)架構師,美國AngelEngineers Inc. 系統(tǒng)架構師。