使用 \n 将一组数组合并为一个字符串

Array of arrays into one single string with \n

我正在尝试从数组的数组中创建一个字符串,但在一个条件下,数组中的最后 2 个元素(不适用于第一行)需要在“”中。
数组如下所示:

const data = [
    //( not applied to this row)
    [
        "id",
        "group_name",
        "admin",
        "email_",
        "og.id",
        "created_by.email",
        "students",
        "namesids"
    ],
    //( applied to the following rows)
    [
        "80",
        "Test group",
        "nilton.updated",
        "nilton@crowdform.co.uk",
        "22",
        "nilton@nilton.com",
        "nilton@nilton.com,pedro@com.com",
        "13,14,27"
    ],
    [
        "18",
        "PRO Group",
        "",
        "",
        "22",
        "sys@stys.com",
        "",
        "13000"
    ],
    [
        "10",
        "Test Group",
        "TEst",
        "Test@test.com",
        "22",
        "test.test@test.com",
        "",
        ""
    ]
]

详情:
不包含任何内容的数据也需要用引号引起来。我所期望的,以及我到目前为止所做的尝试:
预期(这是一个字符串,每行的最后一个字符是 \n):

const this_is_a_string = "
id,group_name,admin,email_,og.id,created_by.email,students,namesids
80,Test group,nilton.updated,nilton@crowdform.co.uk,22,nilton@nilton.com,"nilton@nilton.com,pedro@com.com","13,14,27"
10,Test Group,TEst,Test@test.com,22,test.test@test.com,"",""
...
"

我试过的答案不正确:

data.map(objects => {
    const newAr = objects.reduce((arr, values, i) => {        
        arr = arr + ',' + values
        if (i === 6 || i ===7) return arr = arr + ',' + '"' + values + '"';
        return arr;
    }, "")
    console.log(newAr.substring(1));
    return;
})

如果可能,创建一个能够接收 data 作为第一个参数和需要用引号引起来的位置数组的函数。数组将始终与第一个数组大小相同,这就是为什么我知道需要用引号引起来的位置。

对于每一行,使用 Array.prototype.slice() 将最后两个元素与其余元素分开。

然后就是将最后两个条目映射到引用值并将所有内容连接起来,用逗号分隔。

然后可以将每一行连接成一个由换行符分隔的字符串。

const data = [["id","group_name","admin","email_","og.id","created_by.email","students","namesids"],["80","Test group","nilton.updated","nilton@crowdform.co.uk","22","nilton@nilton.com","nilton@nilton.com,pedro@com.com","13,14,27"],["18","PRO Group","","","22","sys@stys.com","","13000"],["10","Test Group","TEst","Test@test.com","22","test.test@test.com","",""]];

const rowMapper = (row) =>
  [...row.slice(0, -2), ...row.slice(-2).map((v) => `"${v}"`)].join(",");

const [header, ...rows] = data;

const csv = [header.join(","), ...rows.map(rowMapper)].join("\n");

console.log(csv);


如评论中所述,您不妨引用每个值,甚至 headers 并转义任何嵌入的引号

const csv = data
  .map((row) => row.map((v) => `"${v.replace(/"/g, '""')}"`).join(","))
  .join("\n");