这听起来像一项简单的任务,但我无法弄明白:我有一个阵列:
var array = ['opt1','sub1','subsub1','subsubsub1']
由此我想生成以下对象:
{
opt1:{
sub1:{
subsub1:{
subsubsub1:{}
}
}
}
}
我有办法做到这一点,制作一个字符串并使用eval,但是我希望避免这种情况,任何想法?
答案 0 :(得分:28)
您可以使用reduce
:
var array = ['opt1','sub1','subsub1','subsubsub1'];
var object = {};
array.reduce(function(o, s) { return o[s] = {}; }, object);
console.log(object);

但这只是在ECMAScript 5.1中引入的,因此在一些旧版浏览器中不受支持。如果您想要旧版浏览器支持的内容,您可以使用上面MDN文章中描述的polyfill技术,或者使用简单的for
- 循环,如下所示:
var array = ['opt1','sub1','subsub1','subsubsub1'];
var object = {}, o = object;
for(var i = 0; i < array.length; i++) {
o = o[array[i]] = {};
}
console.log(object);
&#13;
答案 1 :(得分:4)
您可以使用lodash设置功能
_.set(yourObject, 'a.b.c')
答案 2 :(得分:4)
答案 3 :(得分:0)
function arr2nestedObject(myArray){
var cp_myArray = myArray;
var lastobj = {};
while(cp_myArray.length>0){
newobj = {};
var prop = cp_myArray.pop();
newobj[prop] = lastobj;
lastobj = newobj;
}
return lastobj;
}
以下代码:
var myArray = ["personal-information", "address", "street",'Great-Success'];
console.log(JSON.stringify(arr2nestedObject(myArray),undefined,2));
将产生以下输出:
{
"personal-information": {
"address": {
"street": {
"Great-Success": {}
}
}
}
}
请让我知道这是否是您的意思。
亲切的问候。
答案 4 :(得分:0)
@pswg答案对于纯js来说是一个很好的答案,但是如果您想要以描述性和功能性的方式使用set a value for final nested prop
的替代方法,则可以使用ramdajs assocPath
{{3} },如下所示:
var array = ['opt1','sub1','subsub1','subsubsub1'];
R.assocPath(array, "the value", {});
https://ramdajs.com/docs/#assocPath
更多详细信息:
对对象进行浅表克隆,设置或覆盖节点 创建给定路径所需的值,并将特定值放在 该路径的末端。请注意,这将复制并展平 将原型属性也添加到新对象上。所有非原始 属性是通过引用复制的。
示例:
R.assocPath(['a', 'b', 'c'], 42, {a: {b: {c: 0}}}); //=> {a: {b: {c: 42}}}
// Any missing or non-object keys in path will be overridden
R.assocPath(['a', 'b', 'c'], 42, {a: 5}); //=> {a: {b: {c: 42}}}