如何使用另一个对象元素中的值创建自定义对象?

时间:2019-11-12 04:43:10

标签: javascript typescript object

我陷入了一个难题,我想从其他对象的条目中创建自己选择的对象。

这就是我想说的

我创建了这样的对象-

{FY13: Array(12), FY14: Array(12), FY15: Array(12)}

and each Array(12) contains 12 months value
0: {DECEMBER: 305613430.7701738}
1: {JANUARY: 275987392.27062917}
2: {FEBRUARY: 233681429.7241771}
3: {MARCH: 276556599.762852}
4: {APRIL: 291581891.6168785}
5: {MAY: 243244065.40839994}
6: {JUNE: 251725888.83152565}
7: {JULY: 263685518.35567823}
8: {AUGUST: 255451062.8538219}
9: {SEPTEMBER: 401511405.31539994}
10: {OCTOBER: 278446608.78520465}
11: {NOVEMBER: 346733805.9584188}

我想从该对象的每个条目中创建另一个对象,并创建一个像这样的新对象-

{
FY13{
  'Q1-FY-13': 305613430.7701738+275987392.27062917+233681429.7241771,
  'Q2-FY-13': 276556599.762852+ 291581891.6168785+243244065.40839994,
  'Q3-FY-13': val of other months....',
  'Q4-FY-13': ''
},
FY14{
  'Q1-FY-13': ...,
  'Q2-FY-13': ...,
  'Q3-FY-13': ...,
  'Q4-FY-13': ....,
},
FY15{
  'Q1-FY-13': ...,
  'Q2-FY-13': ...,
  'Q3-FY-13': ...,
  'Q4-FY-13': ....,
}
}

到目前为止,我已经做到了- 我根据年份对这些对象进行了分组,并将它们存储在一个数组中,并且完全对其进行了硬编码-

let objectArray = [...this.totalObject];

      let groupByYear = objectArray.reduce(function(acc, obj) {
        var key = obj["Year"].trim();

        acc[key] = acc[key] || [];

        acc[key].push({
          [obj.Month.trim().toUpperCase()]: obj.value
        });
        return acc;
      }, {});

      console.log("Group By Year", groupByYear);
      let dataArray = [];
      for (let key in groupByYear) {
        let val = groupByYear[key];
        let obj1 = {
          ["Q1_" + key]: [val[0].DECEMBER + val[1].JANUARY + val[2].FEBRUARY]
        };
        dataArray.push(obj1)
        let obj2 = {
          ["Q2_" + key]: [val[3].MARCH + val[4].APRIL + val[5].MAY]
        };
        dataArray.push(obj2)
        let obj3 = {
          ["Q3_" + key]: [val[6].JUNE + val[7].JULY + val[8].AUGUST]
        };
        dataArray.push(obj3)
        let obj4 = {
          ["Q4_" + key]: [val[9].SEPTEMBER + val[10].OCTOBER + val[11].NOVEMBER]
        };
        dataArray.push(obj4)
      }
      console.log('Data Array',dataArray);

它给了我相同的输出,但是我希望它具有灵活性-任何其他方式?


0: {Q1_FY13: Array(1)}
1: {Q2_FY13: Array(1)}
2: {Q3_FY13: Array(1)}
3: {Q4_FY13: Array(1)}
4: {Q1_FY14: Array(1)}
5: {Q2_FY14: Array(1)}
6: {Q3_FY14: Array(1)}
7: {Q4_FY14: Array(1)}
8: {Q1_FY15: Array(1)}
9: {Q2_FY15: Array(1)}
10: {Q3_FY15: Array(1)}
11: {Q4_FY15: Array(1)}

谢谢您在这里的时间。我不喜欢使用高阶函数,所以如果有任何实际问题,请提及。

1 个答案:

答案 0 :(得分:0)

让我们一步一步走

1)声明必要的变量

var arr = [{"DECEMBER":305613430.7701738},{"JANUARY":275987392.27062917},{"FEBRUARY":233681429.7241771},{"MARCH":276556599.762852},{"APRIL":291581891.6168785},{"MAY":243244065.40839994},{"JUNE":251725888.83152565},{"JULY":263685518.35567823},{"AUGUST":255451062.8538219},{"SEPTEMBER":401511405.31539994},{"OCTOBER":278446608.78520465},{"NOVEMBER":346733805.9584188}];

var quarters = {
q1: ['DECEMBER', "JANUARY", "FEBRUARY"],
q2: ['APRIL', "MAY","MARCH"],
q3: [ "JUNE" ,"JULY", "AUGUST"],
q4: [ "SEPTEMBER" ,"OCTOBER", "NOVEMBER"]
}

var FY ={ FY12: arr, FY13: arr} 

2)获得最终结果

    var result = Object.keys(FY).reduce((acc, fy)=> {
        acc[fy] = Object.keys(quarters).reduce((accq, q) => {
            accq[`${q}-${fy}`] = FY[fy].map(f => {return quarters[q].indexOf(Object.keys(f)[0]) > -1 ? Object.values(f)[0]: null})
                                       .filter(x=>x)  //remove false values
                                      .reduce((a, b) => a + b, 0) ; // sum
            return accq;
        }, {})
    return acc;
    }, {})

    console.log(result)