2017-09-10 48 views
0

我有這樣的代碼:不能使用字符串對象路徑

success(JSON.parse(xhr.responseText).items[0].snippet.title); 

問題是,我可以訪問我想要的,但我希望能夠做到這一點:

var path = 'items[0].snippet.title'; 
success(JSON.parse(xhr.responseText).path); 

而且它不工作:(

這可能沒什麼,但我想不出爲什麼。

謝謝!

+1

使用[lodash](https://lodash.com/docs/4.17.4#get)與其'GET'方法庫:'_.get(JSON.parse(xhr.responseText),路徑)'。 – alexmac

+0

我聽說過它,但我寧願不使用庫只是爲了 – Victofu

+0

我同意Lodash。這正是你需要的。 –

回答

0

對於由串訪問對象的屬性,你需要使用[]符號:

var foo = {bar : 2}; 
foo['bar']; // 2 

但是,這不會對嵌套屬性的工作,這裏是我會按照使用Array.reduce和ES6的辦法:

let path = 'items.snippet.title'; 
let response = JSON.parse(xhr.responseText); 
let result = path.split('.').reduce((pre,cur) => { 
    return pre[cur]; 
}, response); 
success(result); 

在第一iterarion前將響應和CUR「項目」返回result.items等,也不會accesing數組索引時雖然,所以你需要添加內減少一些額外的邏輯工作功能。

const [, cur, position] = cur.match(/^([^\[]+)(?:\[(\d+)])?$/); 
// filter foo[1] capturing foo and 1, then assign them using destructuring. 
// Thanks for edit! 
return (Array.isArray(pre[cur]) ? pre[cur][position] : pre[cur]); 
+0

工作!非常感謝 – Victofu