动态分配对象键会导致最后一个键包含双引号

时间:2017-11-16 18:06:27

标签: javascript

我创建了一个CSV解析器并遇到了一个有趣的情况。当命中onLoad函数时,我的对象row的最后一个键被双引号。我正在寻找原因的解释。有人知道吗?

评论包含示例值

const results = [];
const lines = reader.result.split('\n');
//lines = ["accountId,nickname,rando", "test-arn,test-nickname,test-rando"]
const keys = lines[0].split(',');
//keys = ["accountId", "nickname", "rando"]

forEach((line) => { 
    // line = "test-arn, test-nickname, test-rando"
    const values = line.split(','); 
    // values = ["test-arn", "test-nickname", "test-rando"]
    const row = {}; 

    for (let i = 0; i < keys.length; i++) {
        let key = keys[i];
        row[key] = values[i];
    }

    //row = { accountId: "test-arn", nickname="test-nickname", "rando": "test-rando"}
    results.push(row);
}, lines);

您可以看到rando中的密钥row被双引号括起来

row = { 
    accountId: "test-arn", 
    nickname: "test-nickname", 
    "rando": "test-rando",
}

示例CSV

accountId,nickname,rando^M
test-arn,test-nickname,test-rando^M

完整功能

const parseCsv = ({ file, before, onSuccess, onError }) => {
    before();
    const reader = new FileReader();

    reader.readAsText(file);
    reader.onload = () => {
        const results = [];
        const lines = reader.result.split('\n');
        const keys = lines[0].split(',');

        forEach((line) => { 
            const values = line.split(','); 
            const row = {}; 

            for (let i = 0; i < keys.length; i++) {
                let key = keys[i];
                row[key] = values[i];
            }
            results.push(row);
        }, lines);

        onSuccess(results);
    };

    reader.onError = (error) => {
        onError(error);
    };
};

1 个答案:

答案 0 :(得分:0)

我发现最后一个键中有一个返回字符。

在控制台中:

keys
>(3) ["accountId", "nickname", "rando"] 
JSON.strigify(keys)
>"["accountId","nickname","rando\r"]"

解决方法是删除返回字符

const results = [];
const lines = reader.result.split('\n');
const header = lines.shift().replace(/(\r\n|\n|\r)/gm, ''); //Remove newline characters
const keys = header.split(',');

forEach((line) => {
    const values = line.replace(/(\r\n|\n|\r)/gm, '').split(',');
    const row = {};

    for (let i = 0; i < keys.length; i++) {
        row[keys[i]] = values[i];
    }

    results.push(row);
}, lines);

onSuccess(results);