首页 > 解决方案 > Formatting a new array with existing data - problem

问题描述

I am trying to make a new array from the data object that I have which looks like this:

const data= {
  periods: [{
    month: 'January',
    types: [
      {
        name: 'sick leave',
        difference: '14',
        revisioned: '7000',
        paid: '5000',
      },
      {
        name: 'holiday',
        difference: '12',
        revisioned: '4000',
        paid: '6000',
      },
    ],
    received: '3000',
    taken: '2000',
    result: '0',
  },
  {
    month: 'February',
    types: [
      {
        name: 'sick leave',
        difference: '5',
        revisioned: '100',
        paid: '200',
      },
      {
        name: 'holiday',
        difference: '4',
        revisioned: '300',
        paid: '232',
      },
    ],
    received: '-2000',
    taken: '2000',
    result: '0',
  }],
};

What I would like to do is, to take that object and take the properties types, received, taken and result and from each of these properties values create an array that would be a property of an object in a new array. The end result of the new array would look something like this:

[
  {
    name: 'sick_leave_difference',
    result: ['14', '5'],
  },
  {
    name: 'sick_leave_revisioned',
    result: ['7000', '100'],
  },
  {
    name: 'sick_leave_paid',
    resultat: '[5000, 200]',
  },
  {
    name: 'holiday_difference',
    resultat: ['12', '4'],
  },
  {
    name: 'holiday_revisioned',
    result: ['4000', '300'],
  },
  {
    name: 'holiday_paid',
    result: '[6000, 232]',
  },
  {
    name: 'received',
    resultat: ['3000', '-2000'],
  },
  {
    navn: 'taken',
    result: ['2000', '2000'],
  },
  {
    name: 'result',
    result: ['0', '0'],
  },
];

The problem is that the propery types contains an array and it is different is different from the other properties, so I am not sure how to achieve this and also in an elegant way?

标签: javascriptarrays

解决方案


用于Array.reduce()提取和展平types阵列。减少展平的数组,并使用 迭代每个对象的条目Array.forEach()。如果结果对象不存在,则创建它,然后添加结果。使用以下方法提取回数组Object.values()

const data= {"periods":[{"month":"January","types":[{"name":"sick leave","difference":"14","revisioned":"7000","paid":"5000"},{"name":"holiday","difference":"12","revisioned":"4000","paid":"6000"}],"received":"3000","taken":"2000","result":"0"},{"month":"February","types":[{"name":"sick leave","difference":"5","revisioned":"100","paid":"200"},{"name":"holiday","difference":"4","revisioned":"300","paid":"232"}],"received":"-2000","taken":"2000","result":"0"}]};

const result = Object.values(data.periods
  .reduce((r, { types }) => [...r, ...types], [])
  .reduce((r, { name, ...props }) => {
    Object.entries(props).forEach(([k, v]) => {
      const navn = `${name} ${k}`.replace(' ', '-');
      
      if(!r[navn]) r[navn] = { navn, result: [] };
      
      r[navn].result.push(v);
    });
    
    return r;
  }, {}));

console.log(result);


推荐阅读