我想更改Object中的值,但是这个Object是嵌套的,就像这个
Obj = {
'a': {
'b': {
'c': {
'name': 'bob'
}
}
}
}
并且有一个数组:
['a','b','c']
我想用这个数组得到name
如何将此数组更改为obj['a']['b']['c']['name']
?
必须考虑嵌套对象的不同层次?
我怎么能这样做?
答案 0 :(得分:2)
或者在纯javascript中:
['a','b','c', 'name' ].reduce(function( t , v ){ return t[v];} , Obj)
el = document.getElementById('dbg');
var json = function(val){ return JSON.stringify(val) };
var log = function(val){el.innerHTML += '<div><pre>' + val + '</pre><div>'}
/****************************************************************/
var Obj = {
'a': {
'b': {
'c': {
'name': 'bob'
}
}
}
}
var keyPath = ['a','b','c', 'name' ];
var result = keyPath.reduce(function( transformed , value){
return transformed[value];
} , Obj)
log( 'result\t : ' + result )
/***************************************************************/
// we can do also something like that :
var Obj2 = {
'a': {
'b': {
'c': {
'name': ['bob' , 'marc' , 'jane' , 'lisa']
}
}
}
}
var keyPath2 = 'a.b.c.name.2'
var result2 = keyPath2.split('.').reduce(function( transformed , value){
return transformed[value];
} , Obj2)
log( 'result2\t : ' + result2 )
/***************************************************************/
// and using it in a function
var ns = function( keyPath , context , splitter){
var _keyPath = keyPath.split(splitter|| '.');
return _keyPath.reduce(function( transformed , value){
return transformed[value];
} , context)
};
var keyPath3 = 'a.b.c.name.3';
var result3 = ns( keyPath3 , Obj2 );
log( 'result3\t : ' + result3)
&#13;
<div id='dbg'><div>
&#13;
答案 1 :(得分:1)
这是lodash的经典案例,特别是_.get方法
var Obj = {
'a': {
'b': {
'c': {
'name': 'bob'
}
}
}
}
var keyPath = ['a','b','c'];
alert(_.get(Obj, keyPath).name);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.1/lodash.js"></script>