Javascript 基于年和月字段创建对象

Javascript 基于年和月字段创建对象,javascript,Javascript,我有一个对象数组条目,其中对象的键为年和月。我想重新构造数组,以便在顶层将同一年的条目分组在一起,并将同一年同一月份的条目分组在一个数组中。像这样的 { 2020:{ "January": [objJan1, ObjJan2, ...], "June": [objJune1, ObjJune2, ...], }, 2019:{ "April": [objApril1, ObjApril2, ..

我有一个对象数组
条目
,其中对象的键为
。我想重新构造数组,以便在顶层将同一年的条目分组在一起,并将同一年同一月份的条目分组在一个数组中。像这样的

{
 2020:{
      "January": [objJan1, ObjJan2, ...],
      "June": [objJune1, ObjJune2, ...],
 },
 2019:{
      "April": [objApril1, ObjApril2, ...],
      "July": [objJul1, ObjJul2, ...],
 },
...
}
我试过这个

let entriesByYearMonth = {};
  entries.forEach((entryEl) => {
    const entryElYear = entryEl.year.toString();
    const entryElMonth = entryEl.month.toString();
    console.log(Object.keys(entriesByYearMonth), typeof entryElYear);
    if (entryElYear in Object.keys(entriesByYearMonth)) {
      let entriesByYear = entriesByYearMonth[entryElYear];
      if (entryElMonth in Object.keys(entriesByYear)) {
        entriesByYear[entryElMonth] = [];
      } else {
        entriesByYear[entryElMonth].push(entryEl);
      }
    } else {
      entriesByYearMonth[entryElYear] = { [entryElMonth]: [entryEl] };
    }
  });
但是代码不会为同一年的下一个条目输入if语句
if(Object.keys中的entryElYear(entriesByYearMonth))
,尽管
entryElYear
是string类型,而
Object.keys(entriesByYearMonth)
是字符串数组。我不知道为什么?我做错了什么

编辑:
条目的结构

[
 {
  key1: ...,
  ..
  year: 2020,
  month: "December",
  ...
 },
 {
  key11: ...,
  ..
  year: 2020,
  month: "December",
  ...
 },
{
  key12: ...,
  ..
  year: 2019,
  month: "January",
  ...
 },
...
]

按减速机,您可以按年份分组,如下所示:

const entriesByYearMonth = entries.reduce((accumulator, item) => {
    accumulator[item.year] = accumulator[item.year] || {};
    accumulator[item.year][item.month] = accumulator[item.year][item.month] || [];  
    accumulator[item.year][item.month].push(item);
    return accumulator;
},{});

按减速机,您可以按年份分组,如下所示:

const entriesByYearMonth = entries.reduce((accumulator, item) => {
    accumulator[item.year] = accumulator[item.year] || {};
    accumulator[item.year][item.month] = accumulator[item.year][item.month] || [];  
    accumulator[item.year][item.month].push(item);
    return accumulator;
},{});

我将在一些通用助手函数的基础上构建它

常量映射对象=(fn)=>(obj)=>
Object.fromEntries(Object.entries(obj.map)([k,v])=>[k,fn(v)])
常量组=(prop)=>(xs)=>
reduce((a,{[prop]:p,…rest})=>({
A.
[p] :[…(a[p]| |[]),其余]
}), {})
const groupByYearAndMonth=(输入)=>
mapObject(组(“月”)(组(“年”)(输入))
常量输入=[
{foo:333,年份:2019,月份:'11',日期:29},
{foo:334,年份:2019,月份:'11',日期:30},
{foo:335,年份:2019,月份:'12',日期:1},
{foo:336,年份:2019,月份:'12',日期:2},
// ...
{foo:362,年份:2019,月份:'12',日期:28},
{foo:363,年份:2019,月份:'12',日期:29},
// ...
{foo:368,年份:2020,月份:“一月”,日期:3},
{foo:369,年份:2020,月份:“一月”,日期:4},
// ...
{foo:396,年份:2020,月份:“二月”,日期:1},
{foo:397,年份:2020,月份:“二月”,日期:2},
{foo:398,年份:2020,月份:“二月”,日期:3},
// ...
{foo:425,年份:2020,月份:“三月”,日期:30},
{foo:426,年份:2020,月份:“三月”,日期:31},
// ...
]
console.log(groupbyyear和month(输入))

。作为控制台包装{max height:100%!important;top:0}
我将在一些通用助手函数上构建它

常量映射对象=(fn)=>(obj)=>
Object.fromEntries(Object.entries(obj.map)([k,v])=>[k,fn(v)])
常量组=(prop)=>(xs)=>
reduce((a,{[prop]:p,…rest})=>({
A.
[p] :[…(a[p]| |[]),其余]
}), {})
const groupByYearAndMonth=(输入)=>
mapObject(组(“月”)(组(“年”)(输入))
常量输入=[
{foo:333,年份:2019,月份:'11',日期:29},
{foo:334,年份:2019,月份:'11',日期:30},
{foo:335,年份:2019,月份:'12',日期:1},
{foo:336,年份:2019,月份:'12',日期:2},
// ...
{foo:362,年份:2019,月份:'12',日期:28},
{foo:363,年份:2019,月份:'12',日期:29},
// ...
{foo:368,年份:2020,月份:“一月”,日期:3},
{foo:369,年份:2020,月份:“一月”,日期:4},
// ...
{foo:396,年份:2020,月份:“二月”,日期:1},
{foo:397,年份:2020,月份:“二月”,日期:2},
{foo:398,年份:2020,月份:“二月”,日期:3},
// ...
{foo:425,年份:2020,月份:“三月”,日期:30},
{foo:426,年份:2020,月份:“三月”,日期:31},
// ...
]
console.log(groupbyyear和month(输入))

.as console wrapper{max height:100%!important;top:0}
你能发布条目结构吗?我编辑了问题你能发布条目结构吗?我编辑了问题这给出了
{item:..}
,并以
item
为键。我希望钥匙是今年的。此外,它不会对同一年的项目进行分组。键
始终只有一个对象@BlackMath查看我的编辑。这将提供
{item:..}
,其中
作为键。我希望钥匙是今年的。此外,它不会对同一年的项目进行分组。键
始终只有一个对象@BlackMath看看我的编辑。