在映射的对象中添加自定义键值



所以,我有一个如下格式的csv

| index | origin | Limit | Date 
1        'XYZ'   500     01/05/2020  
2        'BBC'   254     01/07/2020

因此,我使用csvtojson库解析csv,并将其写入另一个json文件

csvtojson()
.fromFile('Data.csv')
.then((json) => {
const newArrayOfObj = json.map((item) => {
let month = item['Date'].split('/')[1];
return {
indessx: item['?Index'],
type: item['origin'],
number: item['limit'],
month:  convertNumberToMonth(month),
date: item['Date'],
};
});

fs.writeFileSync(
'output.json',
JSON.stringify(newArrayOfObj),
'utf-8',
(err) => {
if (err) return err;
}
);
console.log('Data successfully loaded!');
});

现在,我创建了另一个助手函数,它只会将月份(数字(转换为实际的月份名称,下面是助手函数。

let monthNames = [
'Jan',
'Feb',
'Mar',
'Apr',
'May',
'Jun',
'Jul',
'Aug',
'Sep',
'Oct',
'Nov',
'Dec',
];
const convertNumberToMonth = (number) => {
if (number === undefined) return;
return monthNames[number];
};
module.exports = convertNumberToMonth;

因此,问题是我无法使用json文件中的helper函数转换月份,它未定义。

这就是我得到的对象数组格式。

[{
indessx: '100',
type: 'E',
number: '765',
month: undefined,
date: '08/08/20' }]

在纯字符串对象上运行string.split()时,它会返回一个字符串:

> let item = {'Date': '01/05/2020'}; 
undefined
> let month = item['Date'].split('/');
undefined
> month;
[ '01', '05', '2020' ]
> month[1];
'05'

然后它将是monthNames['05'],使用字符串'05'作为获取值的关键字。但是monthNames既不是对象也不是Map,所以它返回undefined

您需要将数字转换为Number对象。您可以在函数中执行此操作(注意,如果参数不是数字,它将给出NaN(,也可以在将number参数传递到函数之前执行此操作。

无论如何,添加Number(number),或者只添加+number,如下所示:

> let monthNames = [
...   'Jan',
...   'Feb',
...   'Mar',
...   'Apr',
...   'May',
...   'Jun',
...   'Jul',
...   'Aug',
...   'Sep',
...   'Oct',
...   'Nov',
...   'Dec',
... ];
undefined
> const convertNumberToMonth = (number) => {
...   if (number === undefined) return;
...   return monthNames[+number - 1];
... };                                                                                                                                                                                            undefined                                                                                                                                                                                         > let item = {'Date': '01/05/2020'};
undefined
> let month = item['Date'].split('/');
undefined
> convertNumberToMonth(month[1]);
'May'
> 

convertNumberToMonth函数中,number是一个字符串,例如"08"。

因此,当您试图访问数组monthNames的索引"08"(即monthNames['08'](时,您会得到一个未定义的值,因为它不存在。

您可以尝试将number解析为整数,这应该可以解决您的问题,

const convertNumberToMonth = (number) => {
if (number === undefined) return;
return monthNames[parseInt(number)]; // Convert to int
};

最新更新