使用 \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");
我正在尝试从数组的数组中创建一个字符串,但在一个条件下,数组中的最后 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");