2016-03-02 65 views

回答

1

解决方案与递归

var obj = { 
 
    a: { 
 
     value: 1 
 
    } 
 
} 
 

 
var str = 'a.value'; 
 

 
function change(obj, prop, newValue) { 
 
    var a = prop.split('.'); 
 
    return (function f(o, v, i) { 
 
     if (i == a.length - 1) { 
 
      o[a[i]] = v; 
 
      return o; 
 
     } 
 
     return f(o[a[i]], v, ++i); 
 
    })(obj, newValue, 0); 
 
} 
 

 
var result = change(obj, str, 'work'); 
 

 
console.log(JSON.stringify(obj, 0, 2));

1

你需要分割的路径,并用它作为对象键来改变对象的值。

如果键不是对象,则会创建一个新对象。

function set(obj, path, value) { 
 
    var p = path.split('.'), 
 
     last = p.pop(); 
 
    p.reduce(function (o, k) { 
 
     if (typeof o[k] !== 'object') { 
 
      o[k] = {}; 
 
     } 
 
     return o[k]; 
 
    }, obj)[last] = value; 
 
} 
 

 
var obj = { a: { value: 1 } }; 
 

 
set(obj, 'a.value', 'work'); 
 
set(obj, 'b.value', 42); 
 
set(obj, 'c', 'c'); 
 
console.log(obj); 
 
set(obj, 'c.value', 'work'); 
 
console.log(obj);

ES6

function set(obj, path, value) { 
 
    var p = path.split('.'), 
 
     last = p.pop(); 
 
    p.reduce((o, k) => o[k] = typeof o[k] === 'object' ? o[k] : {}, obj)[last] = value; 
 
} 
 

 
var obj = { a: { value: 1 } }; 
 

 
set(obj, 'a.value', 'work'); 
 
set(obj, 'b.value', 42); 
 
set(obj, 'c', 'c'); 
 
console.log(obj); 
 
set(obj, 'c.value', 'work'); 
 
console.log(obj);

+1

太感谢你了,你的回答对我帮助很大! –

-2

您可以尝试eval()

eval('obj.'+str + '="work"');