2017-02-13 68 views
2

我是java腳本的新手,所以如果這很瑣碎,我很抱歉。 我的問題是語法,如果我有一個對象:使用JavaScript中的「地址字符串」從json對象獲取字段

this.state = { 
    A : { 
     B: { 
      C : [ 
      {value : 'bob'}, 
      {value : 'Jim'}, 
      {value : 'luke'}, 
      ] 
     } 
    } 
} 

和我有一個字符串location = 'A.B.C[1]'描述我想要的數據的位置。

爲什麼我不能只做data = this.state[location].value

是否有一個簡單的「JavaScript」方式獲取使用位置字符串的數據?

任何幫助將是驚人的:)

+0

有對於沒有內置工具。我見過的用於這個問題的一個術語是「對象圖導航」。網站上至少有一個重複的問題,但很難找到。 – Pointy

+0

字符串是如何生成的?這可能是一個問題XY – charlietfl

+0

使用正則表達式您所在的位置來獲取所有級別 – Weedoze

回答

5

你可能分裂的路徑和減少的對象。

function getValue(o, path) { 
 
    return path.replace(/\[/g, '.').replace(/\]/g, '').split('.').reduce(function (o, k) { 
 
     return (o || {})[k]; 
 
    }, o); 
 
} 
 

 
var o = { A : { B: { C: [{ value: 'Brenda' }, { value: 'Jim' }, { value: 'Lucy' }] } }}; 
 

 
console.log(getValue(o, 'A.B.C[1]').value); // Jim 
 
console.log(getValue(o, 'A.B.C[0].value')); // Brenda 
 
console.log(getValue(o, 'Z[0].Y.X[42]')); // undefined

爲了設置一個值,你可以分割的路徑和步行給定對象減少的路徑。如果不存在對象,則使用該名稱或數組創建一個新屬性。稍後分配值。

function setValue(object, path, value) { 
 
    var way = path.replace(/\[/g, '.').replace(/\]/g, '').split('.'), 
 
     last = way.pop(); 
 

 
    way.reduce(function (o, k, i, kk) { 
 
     return o[k] = o[k] || (isFinite(i + 1 in kk ? kk[i + 1] : last) ? [] : {}); 
 
    }, object)[last] = value; 
 
} 
 

 
var test = {}; 
 
setValue(test, "foo.name", "Mr. Foo"); 
 
setValue(test, "foo.data[0].bar", 100); 
 
setValue(test, "and.another[2].deep", 20); 
 
console.log(test);

+0

正在嘗試做類似的事情,但是,陣列搞砸了。解決方案是否可以在任何級別的數組上使用?即「A.B [0] .c」 –

+0

它適用於任何級別。如果路徑不可解析,則返回'undefined'。 –

+0

太棒了,這是某種巫術,這完美的作品。另一個簡單的問題你有沒有設定數據(即使該字段未定義)相似的方法,如:'的setValue(對象,路徑值)'? :) –