2014-12-23 84 views
0

這是我的JSON變量。動態獲取/設置JSON元素

var json = { input: "hello", payload: { pay1: 123, pay2: 456 } }; 

現在,我有一個變量keypay1

var keypay1 = "payload.pay1"; 

問題1:我怎樣才能只使用動態變量JSON和keypay1的json.payload.pay1的價值???我試過這個,它給了我不確定的。

console.log(json[keypay1]); 

同樣,問題2:如何使用動態變量json和keypay1來設置json.payload.pay1的值?

+0

因爲我在手機上,所以無法發佈代碼,但是您需要一個循環,將對象設置到下一級並返回最終值。 – Jhecht

+0

可能可以簡化如何創建'keypay1',如果這是唯一的使用 – charlietfl

+1

'var keypay =「payload」; console.log(json [keypay] .pay1)'這樣的事情。 – Jai

回答

2
var json = { input: "hello", payload: { pay1: 123, pay2: 456 } }; 

var parts = "payload.pay1".split('.'); 

// get the value 
console.log(json[parts[0]][parts[1]]); // 123 

// set the value 
json[parts[0]][parts[1]] = "foo"; 
+0

當您進入JSON時,最好使用'hasOwnProperty'。只是爲了失敗。 – Pataar

+0

啊好..這是作品。但是var keypay1 =「payload.pay1」就是一個例子。如果變量具有多個節點,例如:payload.pay1.offers.rank - 是否有一種高效且動態的方式在JSON []中傳遞split變量? – user3658423

+0

不是。您的用例不是通用的,每個解決方案都將取決於您的輸入字符串。我建議你問另一個問題,如果你想解決你的其他問題。 –

0

能使用成才這樣使用「鍵盤」作爲重點對象

// Split on . and browse myobject. 
// Update context if property found and check again, else return null 
var getModuleFromString = function(moduleName, myobject) { 
    var fields = moduleName.split('.'), cur = myobject || window; 
    for(var i=0; i<fields.length; i++){ 
     if(typeof cur[fields[i]] === "undefined") return null; 
     cur = cur[fields[i]]; 
    } 
    return cur; 
}; 

var json = { input: "hello", payload: { pay1: 123, pay2: 456, pay3: { a:1, b:2 } } }; 
var keypay1 = "payload.pay1"; 

console.log(getModuleFromString(keypay1, json)); 
// 123 

console.log(getModuleFromString("payload.pay3.a", json)); 
// 1 
0

你可以嘗試通過性循環上訪問屬性。

function findProperty(jsonItem, key){ 
    for(var prop in jsonItem){ 
     if(typeof prop === 'object'){ 
      iterate(jsonItem[prop], key); 
     } else if(key == prop){ 
      return jsonItem["prop"]; 
     } 
    } 
} 

但是,只會返回遇到的第一個匹配項。