我正在尝试从数组中动态创建一个链式JS对象,有人知道如何实现这个目标吗?
更新
我可能有value.dog.cat = 'hello'
,我想访问该变量。
/ UPDATE
item = ['dog', 'cat']
如何动态创建:
value['dog']['cat']
任何香草JS或jQuery都会很酷。
我无法解决这个问题,因为如果我做了一个循环,例如:
new_value = {};
for (var i = 0; i < item.length(); i++) {
new_value += [item[i]; // This doesn't make sense
}
答案 0 :(得分:2)
使用Array.prototype.reduce创建对象或获取值
var itemArray = ['dog', 'cat'];
var itemObject = {};
itemArray.reduce(function(a, b) {
if (!a[b]) {
a[b] = {};
}
return a[b];
}, itemObject);
console.log(itemObject);
itemObject.dog.cat = 'test';
var value = itemArray.reduce(function(a, b) {
return a[b];
}, itemObject);
console.log(value);
&#13;
答案 1 :(得分:1)
如果我已经理解了这个问题,那么
var new_value = {};
for (var i = 1; i < item.length; i++)
{
new_value[item[i-1]] = item[i];
}
答案 2 :(得分:1)
只需要循环。简单的方法是减少。
var details = {
dog : {
cat : "hello world"
}
};
var item = ['dog', 'cat'];
var value = item.reduce( function (prev, cur) {
return prev[cur]; //|| {}; Might want to include the commented out part if keys might not be defined
}, details);
console.log(value);
&#13;
答案 3 :(得分:0)
如果value
是对象,而value.dog
也是具有属性cat
的对象,则您确实可以value.dog.cat
访问value['dog']['cat']
。对象的属性可以作为字符串索引访问,你基本上是正确的。我在您的问题中看到的唯一问题是您首先将属性分配到new_value
的方式。
答案 4 :(得分:0)
forEach()
方法每个数组元素执行一次提供的函数。
function setObject(o, p, v) {
p.forEach(function (a, i, aa) {
if (i === aa.length - 1) {
o[a] = v;
} else {
o[a] = o[a] || {};
o = o[a];
}
});
}
var item = ['dog', 'cat'],
value = {};
setObject(value, item, 'hello')
document.write(value.dog.cat);
document.write('<pre>' + JSON.stringify(value, 0, 4) + '</pre>');
&#13;