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



我遇到了一个问题,我想从其他对象的条目中创建自己选择的对象。

以下是我想说的

我创建了一个像这样的对象-

{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( 声明必要的var

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)

最新更新