聽同事說了一個需求。他有一個數據對象obj,接口會給他返回一個索引key,這個key長度不固定,根據這個key去修改obj對應的值。
舉個例子:
let obj={"level1":{"level2":{"level3":100}},"level1B":{leve2:"999"}}; let key='level1.level2';
let value='wh';
現在我想修改索引key 對應的值 {"level3":100}為變量value的值 'wh'.
方法一:使用eval
eval函數 我看了很多書 都讓別用這個函數。但是它真的很強大。
eval(`obj.${key}=value`);
鑒於eval有一些作用域問題,還有一些安全性問題 聽說最好別用(這個我其實沒怎么用過,本着學習的態度 琢磨了一下方法二)
方法二:使用new Function() 它也可以在函數里將字符串當作js表達式執行。
new Function('obj','key','value',`obj.${key}=value`)(obj,key,value);
注意點:
用模板字符串的時候 只有key需要加${} obj和value雖然也是變量 但是當作普通值處理就好了。(原因的話 我認為因key代表的是動態的屬性,如果不對歡迎指正)
最后: 其實這個也可以寫個遞歸函數來解決。