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



我创建了一个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);

您可以看到 row 内部的键rando被双引号括起来

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);
    };
};

我发现最后一个键中留下了一个返回字符。

在控制台中:

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

解决方法是删除返回字符

const results = [];
const lines = reader.result.split('n');
const header = lines.shift().replace(/(rn|n|r)/gm, ''); //Remove newline characters
const keys = header.split(',');
forEach((line) => {
    const values = line.replace(/(rn|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);

最新更新