在地图内返回对象时,获取“ TypeError:无法读取未定义的属性”切片”

时间:2018-09-29 03:20:28

标签: javascript node.js

我正在遍历一个大文本文件,因此可以将其格式化为JSON格式,然后转储它,当我使用slice来使字段以不同的位置开头时,它可以完美地工作,但是一旦我使用slice,就会出现以下错误:
TypeError: Cannot read property 'slice' of undefined

这是当前代码:

var fs = require('fs');
let words;

fs.readFile('dictionary.txt', "utf-8", function(error, contents) {
    if(error) throw error;
    words = contents.split('\n\n');

    words = words.map(value => value.split('\n'))
    .map((column, index) => {
        return {
            id: index+1, 
            word: column[0].slice(10, -1), 
            translation: column[2].slice(7, -1), 
            description: column[3].slice(10, -1)
        }
    });

    fs.writeFileSync('words.json', JSON.stringify(words));
});

请记住,当我使用console.log(column[0].slice(10, -1)时,它可以正常工作,但是当我在返回的对象中使用它时,我会得到该错误,当我删除slice函数时,代码也可以工作,但是那不是我想要的。

这是文本文件的示例:

English : To obliterate
لقی:  هونەر
كوردی: خاپووركردن
وردەكاری: خاپووركردن

English : to one's credit
لقی:  گشتی 
كوردی: جێی شانازی بوون بۆ كەسێك
وردەكاری: جێی شانازی بوون بۆ كەسێك

English : To outline
لقی:  هونەر
كوردی: كورتە نەخشەی كێشا
وردەكاری: كورتە نەخشەی كێشا

English : To paint without a model
لقی:  هونەر
كوردی: وێنەكێشانی بێ مۆدێل
وردەكاری: وێنەكێشانی بێ مۆدێل

English : To paste again
لقی:  هونەر
كوردی: سەرلەنوێ‌ لكاندنەوە
وردەكاری: سەرلەنوێ‌ لكاندنەوە

English : To patronize
لقی:  هونەر
كوردی: چاودێری 
وردەكاری: چاودێری (هونەرمەندێكی) كرد

English : To pick
لقی:  هونەر
كوردی: پیككاری كرد 
وردەكاری: پیككاری كرد (بەردەكەی تەختكرد)

English : To pick out by color
لقی:  هونەر
كوردی: دیاریكردن بەدژایەتی ڕەنگ 
وردەكاری: دیاریكردن بەدژایەتی ڕەنگ 

English : To plane
لقی:  هونەر
كوردی: دەپێكی سازكرد
وردەكاری:  (دەپێك)ی سازكرد

1 个答案:

答案 0 :(得分:1)

如果文件末尾有\n\n,请添加过滤器以删除最后一个无效的“块”

此外,如果文件中某处有\n\n\n或更多,您可能也要修复该问题

var fs = require('fs');
let words;

fs.readFile('dictionary.txt', "utf-8", function(error, contents) {
    if(error) throw error;
    //               in case there's \n\n\n
    words = contents.replace(/\n{3,}/g, '\n\n').split('\n\n');

    words = words.map(value => value.split('\n'))
    // filter out last block if file ends in \n\n
    .filter(({length}) => length === 4)
    .map((column, index) => {
        return {
            id: index+1, 
            word: column[0].slice(10, -1), 
            translation: column[2].slice(7, -1), 
            description: column[3].slice(10, -1)
        }
    });

    fs.writeFileSync('words.json', JSON.stringify(words));
});

这有点健壮,但可能仍不完美