平面数组到多维数组(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 } ], []);