Javascript 将具有相似键的对象插入到数组中,键是否存在

Javascript 将具有相似键的对象插入到数组中,键是否存在,javascript,arrays,object,reduce,Javascript,Arrays,Object,Reduce,这可能是我无法解决的一个基本问题。我从API接收了一个初始数组值,如下所示: const primaryArray = [ { startDate: '01-01-2021', endDate: '11-01-2021', refs: [ { refId: "FL013", year: "2021" } ] }, { star

这可能是我无法解决的一个基本问题。我从API接收了一个初始数组值,如下所示:

const primaryArray = [
    {
    startDate: '01-01-2021',
    endDate: '11-01-2021',
    refs: [
        {
        refId: "FL013",
                year: "2021"
      }
    ]
  },
  {
    startDate: '01-02-2021',
    endDate: '28-02-2021',
    refs: [
        {
        refId: "FL013",
                year: "2021"
      }
    ]
  },
  {
    startDate: '03-05-2020',
    endDate: '10-06-2020',
    refs: [
        {
        refId: "FL013",
                year: "2020"
      }
    ]
  },
  {
    startDate: '25-03-2019',
    endDate: '25-04-2019',
    refs: [
        {
        refId: "FL013",
                year: "2019"
      }
    ]
  }
];
由于2021年的两个对象与“FL013”共享相同的引用键,我想将它们转换为如下形式,所有对象都从数组中分离出来:

{
    2021: { 
    'year': 2021, 
    'refIds': ['FL013', 'FL013'], 
    'duration': { 
      'FL013': [
        {
          startDate: '01-01-2021',
          endDate: '11-01-2021'
        }, 
        {
          startDate: '01-02-2021',
          endDate: '28-02-2021',
        }
       ]
     }
    }
},
{
    2020: { year: 2020, 'refIds': ['FL013'], 'duration': { 'FL013': {
                                               startDate: '03-05-2020',
                                               endDate: '10-06-2020',
                                             }
          }
},
{
    2019: { year: 2019, 'refIds': ['FL013'], 'duration': { 'FL013': {
                                               startDate: '25-03-2019',
                                               endDate: '25-04-2019',
                                             }
          }
}
我尝试使用JS reduce实现同样的功能,但是创建带有两个日期对象的年数组时,总是给我带来一个错误

这就是我迄今为止努力实现的目标:

const flatArray = primaryArray && primaryArray.reduce(
(acc, {startDate, endDate, refs}, currentIndex) => {

  const year = refs && refs[0] && refs[0].year;
  const refId = refs && refs[0] && refs[0].refId;
            
   if (
        year &&
        refId &&
        startDate &&
        endDate &&
        !Object.prototype.hasOwnProperty.call(acc, year)
      ) {
           acc[year] = {
               year,
               refIds: [refId],
               duration: {
                           [refId]: {
                             startDate,
                             endDate,
                         },
               },
           };
        } else {
            if (year) {
                acc[year].refIds.push(refId);
                acc[year]['duration'][refId] = {
                  startDate,
                  endDate,
                };
              }
            }
   return acc;
},{});
我使用两种方法修改了上面的代码,以获得准确的结果:首先,在accumlator中推送接收到的dates对象

acc[year]['duration'][refId].push({ startDate, endDate }). 
这会引发错误:

未捕获类型错误:acc[year]。持续时间[refId]。推送不是函数

第二,我理解不适用的直接应用[]符号

以下是相同的工作链接:


非常感谢您为解决此问题提供的任何帮助。

您可以使用Array.prototype.reduce执行类似操作:

常量主数组=[ { 起始日期:“01-01-2021”, 截止日期:“11-01-2021”, 参考文献:[ { 参考编号:FL013, 年份:2021年 } ] }, { 起始日期:“01-02-2021”, 截止日期:2021年2月28日, 参考文献:[ { 参考编号:FL013, 年份:2021年 } ] }, { 起始日期:“03-05-2020”, 截止日期:“10-06-2020”, 参考文献:[ { 参考编号:FL013, 年份:2020年 } ] }, { 起始日期:2019年3月25日, 截止日期:2019年4月25日, 参考文献:[ { 参考编号:FL013, 年份:2019年 } ] } ]; const res=primaryArray.reduceAc,{refs,startDate,endDate}=>{ if!acc[refs[0]。年份]{ 会计科目[参考文献[0]。年份]={ 年份:参考文献[0]。年份, refId:[refs[0]。refId], 持续时间:{ [参考文献[0]。refId]:{ 开始日期:开始日期, 结束日期:结束日期 } } } }否则{ acc[refs[0]。年份].refIds.pushrefs[0]。refId; acc[参考文献[0]。年份]。持续时间={ [参考文献[0]。refId]:[ {…acc[refs[0].year].duration[refs[0].refId]}, { 开始日期:开始日期, 结束日期:结束日期 } ] } } 返回acc; }, {}
console.logres 您可以使用Array.prototype.reduce执行以下操作:

常量主数组=[ { 起始日期:“01-01-2021”, 截止日期:“11-01-2021”, 参考文献:[ { 参考编号:FL013, 年份:2021年 } ] }, { 起始日期:“01-02-2021”, 截止日期:2021年2月28日, 参考文献:[ { 参考编号:FL013, 年份:2021年 } ] }, { 起始日期:“03-05-2020”, 截止日期:“10-06-2020”, 参考文献:[ { 参考编号:FL013, 年份:2020年 } ] }, { 起始日期:2019年3月25日, 截止日期:2019年4月25日, 参考文献:[ { 参考编号:FL013, 年份:2019年 } ] } ]; const res=primaryArray.reduceAc,{refs,startDate,endDate}=>{ if!acc[refs[0]。年份]{ 会计科目[参考文献[0]。年份]={ 年份:参考文献[0]。年份, refId:[refs[0]。refId], 持续时间:{ [参考文献[0]。refId]:{ 开始日期:开始日期, 结束日期:结束日期 } } } }否则{ acc[refs[0]。年份].refIds.pushrefs[0]。refId; acc[参考文献[0]。年份]。持续时间={ [参考文献[0]。refId]:[ {…acc[refs[0].year].duration[refs[0].refId]}, { 开始日期:开始日期, 结束日期:结束日期 } ] } } 返回acc; }, {}
console.logres 另一个选项是测试它是否已经是一个数组,如果不是,则创建它。 会计科目类型[年度]['期间][refId]!='[对象数组]'


另一个选项是测试它是否已经是一个数组,如果不是,则创建它。 会计科目类型[年度]['期间][refId]!='[对象数组]'

常量主数组=[{ 起始日期:“01-01-2021”, 截止日期:“11-01-2021”, 参考文献:[{ refId:'FL013', 年份:2021年, }, ], }, { 起始日期:“01-02-2021”, 截止日期:2021年2月28日, 参考文献:[{ refId:'FL013', 年份:2021年, }, ], }, { 起始日期:“03-05-2020”, 截止日期:“10-06-2020”, 参考文献:[{ refId:'FL013', 年份:“2020年”, }, ], }, { 起始日期:2019年3月25日, 截止日期:2019年4月25日, 参考文献:[{ refId:'FL013', 年份:2019年, }, ], }, ]; const result=primaryArray.reduceacc,cur=>{ 常数{ 开始日期, 结束日期, 参考文献:[{ refId, 年 }], }=cur; const entry=会计科目[年度]; const yearExistsAlready=条目!==未定义; 如果存在,请准备好{ entry.refIds.pushrefId; const duration=entry.duration[refId]; const durationExistsAlready=持续时间!==未定义; 如果DurationExistsAllready条目。duration[refId]。推送{ 开始日期, 实际结束 }; else条目。持续时间={ refId:{ 开始日期, 实际结束 } }; }否则{ 行政协调会[年度]={ 年 refId:[refId], 持续时间:{ [refId]:[{ 开始日期, 实际结束 }], }, }; } 返回acc; }, {}; 控制台。日志结果 常量主数组=[{ 起始日期:“01-01-2021”, 截止日期:“11-01-2021”, 参考文献:[{ refId:'FL013', 年份:2021年, }, ], }, { 起始日期:“01-02-2021”, 截止日期:2021年2月28日, 参考文献:[{ refId:'FL013', 年份:2021年, }, ], }, { 起始日期:“03-05-2020”, 截止日期:“10-06-2020”, 参考文献:[{ refId:'FL013', 年份:“2020年”, }, ], }, { 起始日期:2019年3月25日, 截止日期:2019年4月25日, 参考文献:[{ refId:'FL013', 年份:2019年, }, ], }, ]; const result=primaryArray.reduceacc,cur=>{ 常数{ 开始日期, 结束日期, 参考文献:[{ refId, 年 }], }=cur; const entry=会计科目[年度]; const yearExistsAlready=条目!==未定义; 如果存在,请准备好{ entry.refIds.pushrefId; const duration=entry.duration[refId]; const durationExistsAlready=持续时间!==未定义; 如果DurationExistsAllready条目。duration[refId]。推送{ 开始日期, 实际结束 }; else条目。持续时间={ refId:{ 开始日期, 实际结束 } }; }否则{ 行政协调会[年度]={ 年 refId:[refId], 持续时间:{ [refId]:[{ 开始日期, 实际结束 }], }, }; } 返回acc; }, {};
console.LogResulty您的播放代码链接没有任何代码。。。但是当我在我的机器上测试时,输出看起来很好,没有错误…@johntner这可以工作,但没有返回我需要的格式。我已经更新了我的工作代码链接你的游戏代码链接没有任何代码。。。但是当我在我的机器上测试时,输出看起来很好,没有错误…@johntner这可以工作,但没有返回我需要的格式。我已经更新了我的工作代码链接
const flatArray = primaryArray && primaryArray.reduce(
(acc, {startDate, endDate, refs}, currentIndex) => {

  const year = refs && refs[0] && refs[0].year;
  const refId = refs && refs[0] && refs[0].refId;


            
   if (
        year &&
        refId &&
        startDate &&
        endDate &&
        !Object.prototype.hasOwnProperty.call(acc, year)
      ) {
           acc[year] = {
               year,
               refIds: [refId],
               duration: {
                           [refId]: {
                             startDate,
                             endDate,
                         },
               },
           };
        } else {
            if (year) {
                acc[year].refIds.push(refId);
                if (acc[year]['duration'][refId] && typeof acc[year]['duration'][refId] !== '[object Array]') {
                    acc[year]['duration'][refId] = [acc[year]['duration'][refId]]
                }

                acc[year]['duration'][refId].push({
                  startDate,
                  endDate,
                })
              }
            }
   return acc;
},{});