Javascript 根据阵列将阵列转换为具有嵌套特性的对象

Javascript 根据阵列将阵列转换为具有嵌套特性的对象,javascript,node.js,javascript-objects,Javascript,Node.js,Javascript Objects,我有几个数组,如下所示: [ 'businessOpenAccount', 'accountSettings1.page.js' ] [ 'businessOpenAccount', 'accountSettings2.page.js' ] [ 'mainTest', 'test', 'test1.page.js' ] [ 'mainTest', 'test', 'test2.page.js' ] 我的预期结果是以这种方式创建对象: { businessOpenAccount: {

我有几个数组,如下所示:

[ 'businessOpenAccount', 'accountSettings1.page.js' ]
[ 'businessOpenAccount', 'accountSettings2.page.js' ]
[ 'mainTest', 'test', 'test1.page.js' ]
[ 'mainTest', 'test', 'test2.page.js' ]
我的预期结果是以这种方式创建对象:

{
  businessOpenAccount: {
    'accountSettings1.page.js': {},
    'accountSettings2.page.js': {}
  },
  mainTest: {
    test: {
      'test1.page.js': {},
      'test2.page.js': {}
    }
  }
}
因此,实际上我想解析数组并构建一个嵌套对象以从中返回,但是确保检查属性是否已经存在(因为是从以前的数组中定义的),我不会覆盖它,而是根据嵌套的正确顺序在其中添加新的嵌套属性

我尝试了几种方法,使用
reduce
reduceRight
和simple
forEach
/
进行
循环,但我仍然无法真正实现我想要的解决方案

有小费吗

这是迄今为止最好的方法,但我覆盖了在多个数组上循环的属性(使用单个数组的示例):

const relevantFilePath=['businessOpenAccount','accountSettings.page.js'];
设obj={};
relevantFilePath.forEach((el,ind)=>{
如果(ind==0){
obj[el]={};
previousEl=obj[el];
}否则{
previousEl[el]={};
previousEl=previousEl[el];
}
});

控制台日志(obj)您可以迭代给定的数据,减少对象,并获取具有拆分值的最后一项

var data=[['businessOpenAccount','accountSettings1.page.js'],['businessOpenAccount','accountSettings2.page.js'],['mainTest','test','test1.page.js'],['mainTest','test','test2.page.js'],
对象={};
data.forEach(函数(a){
var last=a.pop().split('.')[0];
a、 减少(功能(o,k){
返回o[k]=o[k]|{};
},object)[last]='';
});
console.log(对象)

.as控制台包装{max height:100%!important;top:0;}
一种递归解决方案,适用于任何深度不受限制的子数组

const a=[
['businessOpenAccount','accountSettings1.page.js'],
['businessOpenAccount','accountSettings2.page.js'],
['businessOpenAccount','test1',
[
['test2','test2.settings.page.js',
[
['test2','test2.settings.page.js'],
['test3','test3.settings.page.js'],
], 
"test4",,
],
['test3','test3.settings.page.js'],
]
],
['mainTest','test','test1.page.js'],
['mainTest','test','test2.page.js'],
];
const result={};
常量遍历=(结果,arr)=>{
设firstEl=arr.shift();
if(阵列的第一个实例){
如果(arr.length>=1){
traverseTop(结果,firstEl);
返回导线测量(结果,arr);
} 
返回traverseTop(结果,firstEl);
}
firstEl=firstEl.split('.')[0];
结果[firstEl]=arr.length>=1?(结果[firstEl]| |{}):“”;
如果(arr.length>=1){
返回导线测量(结果[firstEl],arr);
}
返回;
};
常量遍历顶点=(结果,arr)=>{
arr.forEach((subar)=>{
const firstEl=subar.shift().split('.')[0];
结果[firstEl]=结果[firstEl]| |{};
导线测量(结果[firstEl],SubAR)
});
返回结果;
};

log(traverseTop(result,a))