基本上我正在尝试初始化一个JavaScript对象并让它包含一个带有单个键的空对象。例如:
getOject('one.two.three')
会导致对象:
{one:{two:{three:''}}}
据我所知,除非使用数组表示法,否则无法使用动态键名进行初始化
root[dynamicKey] = 'some variable';
所以我需要循环并根据args的数量初始化每个,然后分配它的值,但语法似乎不允许我以我知道的任何方式执行此操作。
所以,如果它不是循环,那就像这样:
jsonifiedForm[rootKey] = {};
jsonifiedForm[rootKey][childKeys[0]] = {};
jsonifiedForm[rootKey][childKeys[0]][childKeys[1]] = $input.val();
我无法想办法做到这一点,我通常不是一个JS人,所以它可能很简单,但我无法在Google或Stack Overflow上找到任何东西
提前谢谢!
答案 0 :(得分:5)
此功能应该是您正在寻找的功能。
function getOject(str) {
// this turns the string into an array = 'one.two.three' becomes ['one', 'two', 'three']
var arr = str.split('.');
// this will be our final object
var obj = {};
// this is the current level of the object - in the first iteration we will add the "one" object here
var curobj = obj;
var i = 0;
// we loop until the next-to-last element because we want the last element ("three") to contain an empty string instead of an empty object
while (i < (arr.length-1)) {
// add a new level to the object and set the curobj to the new level
curobj[arr[i]] = {};
curobj = curobj[arr[i++]];
}
// finally, we append the empty string to the final object
curobj[arr[i]] = '';
return obj;
}
答案 1 :(得分:3)
因为JavaScript引用变量中的值而不是将它们“复制”到变量中,所以我们可以创建初始值,然后引用它,我们将在我们深入研究时将其移动:
var getOject = function (k, s) {
// initialize our value for return
var o = {},
// get a reference to that object
r = o,
i;
// we'll allow for a string or an array to be passed as keys,
//and an optional sepeartor which we'll default to `.` if not given
if (typeof k === 'string') {
k = k.split(s || '.');
}
// do we have an array now?
if (k && k.length) {
//iterate it
for (i = 0; i < k.length; i += 1) {
// set a property on the referenced object
r[k[i]] = {};
// point the reference to the new level
r = r[k[i]];
}
}
// send back the object
return o;
}
console.log(getOject('one.two.three'));
console.log(getOject('four|five|six', '|'));
r
指向o
最初做同样的事情,当我们将引用(r
)深入o
并写入它时,我们'我们去的时候重建o
。
最后两个console.log()
调用输出如下:
另请注意,如果您愿意,我允许您传入一个数组,并将分隔符作为参数,以便您不会遇到.