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
和simpleforEach
/进行
循环,但我仍然无法真正实现我想要的解决方案
有小费吗
这是迄今为止最好的方法,但我覆盖了在多个数组上循环的属性(使用单个数组的示例):
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))如果我善意地说我真的爱你,我是不是很粗鲁?万分感谢!你的回答完全正确,是这个问题的最佳答案,为了感谢你的努力,我真的很感激,我真的很感谢你的努力,但是Nina在本例中的解决方案更加优雅,SO的目的是为其他用户提供最好的解决方案,这些用户将来也会遇到类似的问题,所以在本例中,Nina只是对该问题进行了升级。但是,再次感谢百万分之一你是对的,我发现另一个更优雅:)我已经更新了我的代码来处理嵌套结构。我喜欢递归:D