我有一个空对象和一个字符串:
有没有办法可以将这个转换为
var obj = {};
var str = "a.b.c";
有没有办法可以将这个转换为
obj = { a: { b: { c: { } } } }
我有点理解不了这个问题,甚至不确定是否可能实现。
var obj = {};
var str = "a.b.c";
obj = { a: { b: { c: { } } } }
我有点理解不了这个问题,甚至不确定是否可能实现。
var obj = {};
var str = "a.b.c";
var arr = str.split('.');
var tmp = obj;
for (var i=0,n=arr.length; i<n; i++){
tmp[arr[i]]={};
tmp = tmp[arr[i]];
}
ES6:
let str = "a.b.c",
arr = str.split('.'),
obj, o = obj = {};
arr.forEach(key=>{o=o[key]={}});
console.log(obj);
ES6/缩写(数组存储不必要):
let str = "a.b.c", obj, o = obj = {};
str.split('.').forEach(key=>o=o[key]={});
console.log(obj);
ES6/Array.prototype.reduce:
let str = "a.b.c", last;
let obj = str.split('.').reduce((o, val) => {
if (typeof last == 'object')
last = last[val] = {};
else
last = o[val] = {};
return o;
}, {});
console.log(obj);
tmp = tmp[arr[i]] = {}
并且去掉花括号。 - vol7ronYAHOO.namespace = function() {
var a=arguments, o=null, i, j, d;
for (i=0; i<a.length; i=i+1) {
d=(""+a[i]).split(".");
o=YAHOO;
// YAHOO is implied, so it is ignored if it is included
for (j=(d[0] == "YAHOO") ? 1 : 0; j<d.length; j=j+1) {
o[d[j]]=o[d[j]] || {};
o=o[d[j]];
}
}
return o;
};
//Usage: getObjectAsString('a.b.c'.split(/\./))
function getObjectAsString (array){
return !array.length ? '{}'
: '{"' + array[0] + '":' + getObjectAsString (array.slice(1)) + '}';
}
JSON.parse(getObjectAsString('a.b.c'.split(/\./)))
编辑:删除了“字符串输入”版本,因为它仅适用于命名空间中的单个字母子部分,例如问题中给出的一个(a.b.c),这通常不是情况。
给你:
var string = "a.b.c",
array = string.split('.');
JSON.parse("{\"" + array.join('": {\"') + "\": {" +array.map(function () {return '}'}).join('') + "}")
eval()
存在普遍的厌恶情绪。实际上,由于您控制着传递给eval()
的代码,因此在您的解决方案中使用它的主要缺点是性能受到影响。顺便说一下:https://dev59.com/z3VC5IYBdhLWcg3wvT1a - Jonathan Mfunction ensureKeys(str, obj) {
for(var parts = str.split('.'), i=0, l=parts.length, cache=obj; i<l; i++) {
if(!cache[parts[i]]) {
cache[parts[i]] = {};
}
cache = cache[parts[i]];
}
return obj;
}
var obj = {};
ensureKeys('a.b.c', obj);
// obj = { a: { b: { c: {} } } }