嗨我有一个json数据如下:
{
"details":
{
"data1":
{
"monthToDate":1000,
"firstLastMonth":"December",
"firstLastMonthAmount":5000,
"secondLastMonth":"November",
"secondLastMonthAmount":12000
},
"data2":
{
"monthToDate":4000,
"firstLastMonth":"December",
"firstLastMonthAmount":10000,
"secondLastMonth":"November",
"secondLastMonthAmount":15000
},
"data3":
{
"monthToDate":2000,
"firstLastMonth":"December",
"firstLastMonthAmount":8000,
"secondLastMonth":"November",
"secondLastMonthAmount":12000
}
}
}
我有以下语句的打字稿,
....
Object.values(data.details.data1).map(obj => {
if (obj === 'January') {
xAxisTranslatedArray.push(this.JAN);
} else if (obj === 'February') {
xAxisTranslatedArray.push(this.FEB);
} else if (obj === 'March') {
xAxisTranslatedArray.push(this.MAR);
} else if (obj === 'April') {
xAxisTranslatedArray.push(this.APR);
} else if (obj === 'May') {
xAxisTranslatedArray.push(this.MAY);
} else if (obj === 'June') {
xAxisTranslatedArray.push(this.JUN);
} else if (obj === 'July') {
xAxisTranslatedArray.push(this.JUL);
} else if (obj === 'August') {
xAxisTranslatedArray.push(this.AUG);
} else if (obj === 'September') {
xAxisTranslatedArray.push(this.SEP);
} else if (obj === 'October') {
xAxisTranslatedArray.push(this.OCT);
} else if (obj === 'November') {
xAxisTranslatedArray.push(this.NOV);
} else if (obj === 'December') {
xAxisTranslatedArray.push(this.DEC);
}
});
使用lodash,highcharts和i18n翻译。所以我的每个this.MONTH
都是i18n键。我无法直接传递值,因为无法翻译它们。所以我需要将每个值推送到一个数组并传递到highchart的X轴。我的问题基本上是当我看到if else语句看起来太长而且有点重复时。这里有捷径吗?先谢谢你们。
答案 0 :(得分:6)
使用单独的地图对象:
const months = {
January: this.JAN,
February: this.FEB,
March: this.MAR,
// etc,
}
Object.values(data.details.data1).forEach(obj => {
if (months[obj]) {
xAxisTranslatedArray.push(months[obj]);
}
});
或者,您可以将if
替换为filter
:
Object.values(data.details.data1)
.filter(obj => months[obj])
.forEach(obj => xAxisTranslatedArray.push(months[obj]));
另请注意,我使用forEach
代替map
。 map
用于修改数组,但您只是在数组上进行迭代。 forEach
是语义上正确的选择。
答案 1 :(得分:2)
您必须使用bracket
表示法。
另外,使用substring
或slice
方法获取前three
个字符。
另外,请不要忘记检查obj
是否为string
。
var months = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ];
if(typeof obj === 'string' && months.includes(obj))
xAxisTranslatedArray.push(this[obj.substring(0,3).toUpperCase()]);
答案 2 :(得分:2)
您可以使用地图定义,如下所示:
let mapping = {};
mapping['January'] = this.JAN;
... // rest of definitions.
Object.values(data.details.data1).forEach(obj => {
if(mapping[obj]){
xAxisTranslatedArray.push(mapping[obj]);
});
答案 3 :(得分:2)
好像obj
的前三个字符转换为大写就是你想要的关键,试试
var monthArray = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ];
Object.values( data.details.data1 ).forEach(obj => {
if ( monthArray.indexOf( obj ) != -1 )
{
xAxisTranslatedArray.push(this[ obj.substring(0,3).toUpperCase() ]);
}
});