我尝试动态地深入对象内部。对象子对象是未知的,应该从字符串中使用。
希望您能在下面看到我的尝试。我将无法解决的部分注释掉了。
var global_object = {};
function populate(id, text) {
let parts = id.split('/');
for(let key in parts) {
let part = parts[key];
// global_object['this']['is']['a']['long']['url'] = text;
console.log(part);
}
}
populate('this/is/a/long/url', 'My text');
结果可能是这样的:
this: {
is: {
a: {
long: {
url: "My text"
}
}
}
}
https://jsfiddle.net/2f6kue74/
ES6解决方案也被接受
答案 0 :(得分:1)
您可以执行以下操作,存储var obj
,然后每回合将i放入新密钥中。然后,对于文本,使用另一个var来“记住”最后一个。
var global_object = {};
function populate(id, text) {
let parts = id.split('/');
let obj = global_object, last_obj, part;
for(let key in parts) {
part = parts[key];
last_obj = obj;
obj[part] = {};
obj = obj[part]
console.log(part);
}
last_obj[part] = text;
}
populate('this/is/a/long/url', 'My text');
console.log(global_object);
答案 1 :(得分:1)
不包含外部变量的自包含替代递归解决方案
const populate = (id, text, result) => {
const arr = id.split('/');
let key = arr.shift();
if(key) {
result[key] = {};
if(!arr.length) { result[key] = text; }
populate(arr.join("/"), text, result[key])
}
return result;
}
console.log(populate('this/is/a/long/url', 'My text', {}));
答案 2 :(得分:0)
类似的事情应该起作用。 obj
是要填充的当前对象,并随for
循环的每次迭代进行更新。
let obj = global_object;
function populate(id, text) {
let parts = id.split('/');
for (let key in parts) {
let part = parts[key];
obj[part] = {};
obj = obj[part];
}
obj = text;
}
答案 3 :(得分:0)
或减少它
var global_object = {};
function populate(id, text) {
global_object = id.split("/").reduceRight((acc, part) => {
var nested = JSON.parse(JSON.stringify(acc));
acc = {};
acc[part] = nested;
return acc;
}, text);
}
populate("this/is/a/long/url", "My text");