2015-05-04 93 views
0

我不確定是否可以通過JavaScript實現這樣的事情,所以我在這裏尋求幫助。通過多級字符串值獲取JS對象引用

我有一個字符串:

var value = 'level1.level2.level3'; 

而且我有一個對象:

var object = { 
    level1 : { 
     level2 : { 
      level3 : 0 
     }, 
    }, 
} 

是否有可能使用字符串值,而不僅僅是特定對象鍵的值來獲得該對象的引用。使用遍歷函數但引用可以使用它。

JSFiddle

我檢查,我敢肯定這不是一個重複的問題,因爲在解析函數的複製版本,結果將是對象鍵值不是對象密鑰本身

+0

我怕,你必須把它寫 –

回答

2

一個內膽:

[ob].concat(value.split('.')).reduce(function(a, b) { return a[b] }) 

樣品:

Object.prototype.getValue = function(path) { 
 
    return [this].concat(path.split('.')).reduce(function(a, b) { return a[b] }); 
 
} 
 

 
// usage: 
 

 
alert((
 
{ 
 
    level1 : { 
 
     level2 : { 
 
      level3 : 0 
 
     }, 
 
    }, 
 
}).getValue('level1.level2.level3'));

你不能用這種方式改變0的價值,因爲它是不是一個對象引用

你需要得到level1.level2對象,如果你想影響你的原始對象

ob.getValue('level1.level2').level3 = 25; 

改變其level3場 - 這就是如何JavaScript的工作

然而,它可以編寫一個方法來設置它的值

Object.prototype.setValue = function(path, value) { 
 
    var last = (path = path.split('.')).splice(-1); 
 
    [this].concat(path).reduce(function(a, b) { return a[b] })[last] = value; 
 
} 
 

 
var ob = { 
 
    level1 : { 
 
    level2 : { 
 
     level3 : 0 
 
    } 
 
    } 
 
}; 
 

 
ob.setValue('level1.level2.level3', 25); 
 

 
alert(ob.level1.level2.level3);

+0

謝謝,這正是我需要的。 – Dazvolt

0
function getValue(object, path) { 
    var array = path.split('.'); 
    var current = object; 
    for (var i = 0; i < array.length; i++) { 
     current = current[array[i]]; 
    } 
    return current; 
} 

使用例如var x = getValue(object, value);

0

雖然我討厭使用eval,你可以嘗試,如果你是絕對肯定value

var object = { 
 
    level1 : { 
 
    level2 : { 
 
     level3 : 'text' 
 
    } 
 
    } 
 
}; 
 

 
var value = 'level1.level2.level3'; 
 

 
$('.result').text(eval('object.' + value));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class='result'></div>