将键相似的对象插入数组,键是否存在

如何解决将键相似的对象插入数组,键是否存在

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

const primaryArray = [
    {
    startDate: '01-01-2021',endDate: '11-01-2021',refs: [
        {
        refId: "FL013",year: "2021"
      }
    ]
  },{
    startDate: '01-02-2021',endDate: '28-02-2021',{
    startDate: '03-05-2020',endDate: '10-06-2020',year: "2020"
      }
    ]
  },{
    startDate: '25-03-2019',endDate: '25-04-2019',year: "2019"
      }
    ]
  }
];

由于 2021 年的两个对象与 'FL013' 共享相同的引用键,我想将它们转换为这样的形式,所有对象都从数组中分离出来:

{
    2021: { 
    'year': 2021,'refIds': ['FL013','FL013'],'duration': { 
      'FL013': [
        {
          startDate: '01-01-2021',endDate: '11-01-2021'
        },{
          startDate: '01-02-2021',}
       ]
     }
    }
},{
    2020: { year: 2020,'refIds': ['FL013'],'duration': { 'FL013': {
                                               startDate: '03-05-2020',}
          }
},{
    2019: { year: 2019,'duration': { 'FL013': {
                                               startDate: '25-03-2019',}
          }
}

我尝试使用 JS reduce 来做同样的事情,但是创建带有两个日期对象的 year 的数组一直给我一个错误

这是我目前尝试实现的目标:

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,},};
        } else {
            if (year) {
                acc[year].refIds.push(refId);
                acc[year]['duration'][refId] = {
                  startDate,};
              }
            }
   return acc;
},{});

我使用两种方法修改了上面的代码以获得确切的结果:首先,推送累加器中接收到的日期对象

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

这会引发错误

Uncaught TypeError: acc[year].duration[refId].push is not a function

或第二个,直接应用 [] 符号(据我所知不适用)。

这是相同的工作链接https://onecompiler.com/javascript/3wwzz3f4s

任何帮助解决相同的问题,高度赞赏。

解决方法

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

const primaryArray = [
    {
    startDate: '01-01-2021',endDate: '11-01-2021',refs: [
        {
        refId: "FL013",year: "2021"
      }
    ]
  },{
    startDate: '01-02-2021',endDate: '28-02-2021',{
    startDate: '03-05-2020',endDate: '10-06-2020',year: "2020"
      }
    ]
  },{
    startDate: '25-03-2019',endDate: '25-04-2019',year: "2019"
      }
    ]
  }
];

const res = primaryArray.reduce((acc,{refs,startDate,endDate}) => {
  if(!acc[refs[0].year]) {   
    acc[refs[0].year] = {
      year: refs[0].year,refIds: [refs[0].refId],duration: {
        [refs[0].refId]: {
          startDate: startDate,endDate: endDate
        }
      }
    }
  } else {
    acc[refs[0].year].refIds.push(refs[0].refId);
    acc[refs[0].year].duration = {
      [refs[0].refId]: [
        {...acc[refs[0].year].duration[refs[0].refId]},{
          startDate: startDate,endDate: endDate
        }
      ]

    }
  }

  return acc;
},{})

console.log(res);

,

另一个选择是测试它是否已经是一个数组,如果不是则创建它。 typeof acc[year]['duration'][refId] !== '[object Array]'

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,},};
        } 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,})
              }
            }
   return acc;
},{});
,

const primaryArray = [{
    startDate: '01-01-2021',refs: [{
      refId: 'FL013',year: '2021',],year: '2020',year: '2019',];

const result = primaryArray.reduce((acc,cur) => {
  const {
    startDate,refs: [{
      refId,year
    }],} = cur;
  const entry = acc[year];
  const yearExistsAlready = entry !== undefined;
  if (yearExistsAlready) {
    entry.refIds.push(refId);
    const duration = entry.duration[refId];
    const durationExistsAlready = duration !== undefined;
    if (durationExistsAlready) entry.duration[refId].push({
      startDate,endDate
    });
    else entry.duration = {
      refId: {
        startDate,endDate
      }
    };
  } else {
    acc[year] = {
      year,duration: {
        [refId]: [{
          startDate,endDate
        }],};
  }
  return acc;
},{});
console.log(result)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?