鍍金池/ 問答/Java  HTML/ 已知一個對象,還有一個數(shù)據(jù)路徑的字符串,如何根據(jù)數(shù)據(jù)路徑找到值

已知一個對象,還有一個數(shù)據(jù)路徑的字符串,如何根據(jù)數(shù)據(jù)路徑找到值

有一個對象

var obj = {
  a: {
    b: {
      c: 3
    }
  }
};
var text = 'a.b.c'

如何根據(jù) text 路徑修改 c 的值為 4,讓結(jié)果為

{
  a: {
    b: {
      c: 4
    }
  }
}

小程序的 setData 方法就支持數(shù)據(jù)路徑輸入,我就是想知道如何實現(xiàn)這個功能,已知思路是遞歸

let text = 'a.b.c';
this.setData({
    [text]: 4
})

謝謝各位大佬幫忙

回答
編輯回答
溫衫
function setObjfromText(obj,text,value){
    let temp=obj
    let textgroup = text.split('.')
    let l = textgroup.length
    for(let i=0;i<l-1;i++){
      temp[textgroup[i]] = typeof(temp[textgroup[i]])=='object'?temp[textgroup[i]]:{}
      temp = temp[textgroup[i]]
    }
    temp[textgroup[l-1]] = temp[textgroup[l-1]] | value
    return obj
}
2017年1月9日 08:59
編輯回答
貓館
function setObjText(o,t,v){ //因為是設(shè)置,所以我理解已經(jīng)有這個結(jié)構(gòu)否則需要保證路徑上各級都是對象
let tmp=o;
let t2k=t.split('.');
for(let i=0;i<t2k.length;i++){
    tmp[t2k[i]]=typeof(tmp[t2k[i]])=='object'?tmp[t2k[i]]:{} ;
    tmp=tmp[t2k[i]];
  }
  tmp=value;
}
2017年6月1日 10:30
編輯回答
櫻花霓
var obj = {
  a: {
    b: {
      c: 3
    }
  }
}
var text = 'a.b.c'
function setData(obj, config) {
  let keys = Object.keys(config)
  keys.forEach(key => {
    cur = obj
    let names = key.split('.')
    let last = names.length - 1
    names.forEach((name, index) => {
      if (!cur[name]) cur[name] = {}
      if (last === index) {
        cur[name] = config[key]
      } else {
        cur = cur[name]
      }
    })
  })
}
setData(obj, {[text]: 4, 'e.f': 6}) // obj: {a:{b:{c:4}},e:{f:6}}}
2017年4月8日 20:25