Javascript JS:将数组简化为嵌套对象

Javascript JS:将数组简化为嵌套对象,javascript,arrays,object,nested,reduce,Javascript,Arrays,Object,Nested,Reduce,所以我有这个数组 var mapped = [[2016, "October", "Monday", {object}], [2017, "January", "Friday", {object}], [2017, "January", "Wednesday", {object}], [2017, "October", "Monday", {object}]] 我想要完成的是这样的事情: [{ "2016": [{ "October": [{ "

所以我有这个数组

var mapped = [[2016, "October", "Monday", {object}], [2017, "January", "Friday", {object}], [2017, "January", "Wednesday", {object}], [2017, "October", "Monday", {object}]]
我想要完成的是这样的事情:

[{
    "2016": [{
        "October": [{
            "Monday": [{object}]
        }]
    }],
}, {
    "2017": [{
        "January": [{
            "Friday": [{object}]
        }, {
            "Wednesday": [{object}]
        }]
    }, {
        "October": [{
            "Monday": [{object}]
        }]
    }]
}]
[
    2016: [{
        "month": "October"
    }]
],
[
    2017: [{
        "month": "January"
    },
    {
        "month": "January"
    },
    {
        "month": "September"
    }]
]
我到处找了这么久,找不到解决办法。。通过使用reduce,我得到如下结果:

[{
    "2016": [{
        "October": [{
            "Monday": [{object}]
        }]
    }],
}, {
    "2017": [{
        "January": [{
            "Friday": [{object}]
        }, {
            "Wednesday": [{object}]
        }]
    }, {
        "October": [{
            "Monday": [{object}]
        }]
    }]
}]
[
    2016: [{
        "month": "October"
    }]
],
[
    2017: [{
        "month": "January"
    },
    {
        "month": "January"
    },
    {
        "month": "September"
    }]
]
看起来我好像有什么事,但还是那么遥远。。。这就是我正在做的:

mapped.reduce((years, array) => {

                    years[array[0]] = years[array[0]] || [];

                    years[array[0]].push({
                        month: array[1]
                    })

                    return years;

                }, [])

不完全是您指定的格式,但我觉得以下脚本输出的格式将是最有用的—它只在最深层生成数组:

const-mapped=[[2016年10月、周一、{a:1}]、[2017年1月、周五、{a:1}]、[2017年1月、周三、{a:1}]、[2017年10月、周一、{a:1}];
const result=mapped.reduce((acc,[年、月、日、对象])=>{
设curr=acc[year]=acc[year]|{};
curr=curr[month]=curr[month]| |{};
curr=curr[day]=curr[day]| |[];
当前推送(对象);
返回acc;
}, {});
控制台日志(结果);

.as console wrapper{max height:100%!important;top:0;}
要实现相同的精确结构,您可以尝试以下策略。这将适用于任何嵌套级别,并将继续构建嵌套对象。请看一看这个示例,以了解将一般处理的各种嵌套级别

  • 将每个元素映射到相应的嵌套结构中(使用reduce映射)

  • 将映射数组中的每个元素合并到单个对象中,以合并所有冗余键

  • 将最终嵌套对象转换为所需的数组结构

const-mapped=[[2016年10月”、“星期一”、“上午”{time:“上午10点”}、[2017年1月”、“星期五”{object:“object”}、[2017年1月”、“星期三”{object:“object”}、[2017年10月”、“星期一”{object:“object”}];
//将所有对象映射到相应的嵌套结构
常量nestedMap=mapped.map(元素=>{
let reversed=[…elem.reverse()];
设firstElem=反向。拼接(0,1)[0];
return reversed.reduce((acc,elem)=>{let newAcc={};newAcc[elem]=[acc];return{…newAcc}},firstElem);
})
//组合数组以形成单个对象
const nestedObj=nestedMap.reduce((acc,elem)=>{
设firstKey=Object.keys(elem)[0];
acc[第一键]
?
acc[firstKey]。推送(元素[firstKey][0])
:
acc[firstKey]=elem[firstKey];
返回acc;
}, {})
//将每个对象作为元素转换回数组
const nestedFinalArr=Object.keys(nestedObj.map)(key=>({[key]:nestedObj[key]}))

console.log(nestedFinalArr)