平面数组到多维数组(JavaScript)

平面数组到多维数组(JavaScript),javascript,arrays,object,Javascript,Arrays,Object,我有以下数组: var sampleArray = [ "CONTAINER", "BODY", "NEWS", "TITLE"]; 我希望有以下输出: var desiredOutput = [{ "CONTAINER": [{ "BODY": [{ "NEWS": [{ "TITLE": [] }] }]

我有以下数组:

var sampleArray = [
  "CONTAINER",
  "BODY",
  "NEWS",
  "TITLE"];
我希望有以下输出:

var desiredOutput = [{
        "CONTAINER": [{
            "BODY": [{
                "NEWS": [{
                    "TITLE": []
                }]
            }]
        }]
    }];
如何在JavaScript中实现这一点

已经尝试过递归循环,但不起作用,给我未定义的

    dataChange(sampleArray);
    function dataChange(data) {
        for (var i = 0; i < data.length; i++) {
            changeTheArray[data[i]] = data[i + 1];
            data.splice(i, 1);
            dataChange(changeTheArray[data[i]]);
        }
    }
dataChange(sampleArray);
函数数据更改(数据){
对于(变量i=0;i
谢谢

嗨,我做了一点:

var sampleArray=[
“集装箱”,
“身体”,
“新闻”,
“标题”
], 
GeneratorArray=[],
tmp=null;
对于(var i=0;i
这样就可以了:

constsamplearray=[“容器”、“正文”、“新闻”、“标题”];
常量数据=[];//起始元素。
让电流=数据;//指向循环中当前元素的指针
forEach(key=>{//对于每个条目,在`sampleArray`中命名为`key`),
const next=[];//新数组
current.push({[key]:next});//将`{key:[]}`添加到当前数组中,
current=next;//将指针移动到刚才添加的数组。
});

控制台日志(数据)这在一行中完成了您的要求,并且没有附加变量:

let desiredOutput = sampleArray.reduceRight((obj, key) => [ { [key]: obj } ], []);

reduceRight
调用从数组的右端开始,逐步累积当前数据(以
[]
的初始值作为种子)作为新对象中单个键的值
{[key]:\u value}
,其中该对象本身就是数组中的单个项
[…]

漂亮的巫术。。。我试图构建一个
reduce
方法,但由于累加器沿树向下移动,无法使其工作。。。
倒车
是一种巧妙的触控方式:D@Xufox是的,当你发表评论时,我自己也得出了这个结论-我最初的测试被
.reverse()
执行就地反转的事实弄糊涂了,我的测试数据已经损坏了。因此,使用
.reduceRight
实际上更好,因为它使原始数组保持不变。@Cerbrus实际上,
reduceRight()
更好。@Cerbrus我也用
reduce
尝试过它,并基于类似于
{data:[],referencetoInnerary:[]
,但是Alnitak做得更快了…甚至更好:D我不知道有这样一件事,
reduceRight
…问问题的人都是善变的野兽;-)我想使用一个额外的临时变量来避免函数第二行中的解引用:
let next=[];current.push({[key]:next});current=next
@Alnitak:是的,我有点惊讶。好的建议:-)Re:您的编辑-为什么滥用
。forEach
,当
.reduce
专门用于处理该累积时,对当前
变量的使用顺序理解不足?我曾考虑过类似的解决方案,但没有参考语言规范,我无法确定对
current=[]
的赋值是在
之前还是之后进行的。
.push
中的
变量设置为
当前
的旧值。这种说法没有改变。我不是说这是一段好代码。我刚刚意识到这是可能的,我想补充一下。
let desiredOutput = sampleArray.reduceRight((obj, key) => [ { [key]: obj } ], []);