我有一个javascript对象定义为(在其他地方我无法控制)。
var config = {
a: 2
}
config['b[1]'] = 9;
config['b[2]'] = 8;
config['c[test]'] = 3;
我想把它转换成类似的东西。 (对于键1,我的意思是config ['b'] ['1'] = 9)
var transformed = {
a: 2,
b: { 1: 9, 2: 8},
c: { test: 3}
}
我该如何轻松地做到这一点?如果它有帮助我使用lodash。
答案 0 :(得分:4)
您可以使用for()循环遍历对象键并使用match函数获取必要的新键。 希望这有帮助
var config = {
a: 2
};
config['b[1]'] = 9;
config['c[test]'] = 3;
var key, match, obj;
for(key in config) {
match = key.match(/(.+)\[(.+)\]/);
if(match) { // for example key is 'b[1]'
obj = config[match[1]] || {}; // <= Update create new object or use filled
obj[match[2]] = config[key]; // add new property (match[2] => '1') to new object
config[match[1]] = obj; // add new property (match[1] => 'b') to config
delete config[key]; // remove composite key
}
}
console.dir(config);
答案 1 :(得分:1)
JS没有这样做的内置功能。<br/> 但你可以使用一个小助手方法。
function setProp(obj, prop, value){
var s = String(prop),
a = s.replace("[", "][").split("]["),
last = a.length - 1,
p, q;
if(last && s.substr(-1) === "]"){
p = a[last];
a[last] = p.substr(0, p.length-1);
}
for(var i=0, me = obj; i<last; ++i){
var p = a[i];
//check if property is not a primiive or undefined
var hasProp = p in me && me[p] === Object(me[p]);
if(!hasProp){ //create a object for it
q = a[i+1];
//use an Array for numeric indices
me[p] = (q === (+q).toString())? []: {};
//always use Objects
//me[p] = {};
}
me = me[p];
}
me[a[last]] = value;
}
var config = { a: 2 };
setProp(config, 'b[1]', 9);
setProp(config, 'b[2]', 8);
setProp(config, 'c[test]', 3);
小心你的字符串,解析器非常基本 它假定输入字符串有效。
答案 2 :(得分:0)
不确定这与eval相比有多高效,但它适用于大多数情况
var obj = {
some: {
string: {
location: 2
}
}
};
console.log(getDataFromObj(obj, "some.string['location']"));
function getDataFromObj (obj, key) {
return new Function("return obj." + key)()
}