gpt4 book ai didi

javascript - 将 JavaScript 数组转换为 JSON 对象

转载 作者:行者123 更新时间:2023-11-30 18:22:21 25 4
gpt4 key购买 nike

我正在修改 Google Apps 脚本中的邮件合并项目。我面临的问题是如何使电子邮件正文显示内联图像。目前,在调用 GmailApp.sendEmail() 后,原始电子邮件模板中存在的所有内联图像都显示为附件。

我的猜测是,如果我找到某种方法将 imgVars 数组转换为像这样的 JSON 对象(取自 example in GAS documentation ),则可以显示内联图像:

  MailApp.sendEmail(
"sg.appsscript@gmail.com",
"Logos",
"",
{ htmlBody:
"inline Google Logo<img src='cid:googleLogo'> images! <br/> inline YouTube Logo <img src='cid:youTubeLogo'>",
inlineImages:
{ googleLogo: googleLogoBlob,
youTubeLogo: youtTubeLogoBlob
}
}
);

所以我想做的是像这样转换一个数组:

var array = { item1, item2, item3 };

像这样的 JSON 对象:

var json = { item1Name: item1,
item2Name: item2,
item3Name: item3
};

这是我正在处理的邮件合并的代码片段:

  //---------------------------------------------------------------
// If there are inline images in the body of the email
// Find them and store them in an array, imgVars
//---------------------------------------------------------------
if(emailTemplate.search(/<\img/ != -1)) {
var inlineImages = {};

// Extract all images from the email body
var imgVars = emailTemplate.match(/<img[^>]+>/g);

// For each image, extract its respective title attribute
for (i in imgVars) {
var title = imgVars[i].match(/title="([^\"]+\")/);
if (title != null) {
title = title[1].substr(0, title[1].length-1);
for (j in attachments) {
if (attachments[j].getName() == title) {
inlineImages[title] = attachments[j].copyBlob();
attachments.splice(j,1);
}
}
var newImg = imgVars[i].replace(/src="[^\"]+\"/,"src=\"cid:"+title+"\"");
emailTemplate = emailTemplate.replace(imgVars[i],newImg);
}
}
}

objects = getRowsData(dataSheet, dataRange);
for (var i = 0; i < objects.length; ++i) {
var rowData = objects[i];
if(rowData.emailSent != "EMAIL_SENT") {

// Replace markers (for instance ${"First Name"}) with the
// corresponding value in a row object (for instance rowData.firstName).

var emailText = fillInTemplateFromObject(emailTemplate, rowData);
var emailSubject = fillInTemplateFromObject(selectedTemplate.getSubject(), rowData);

GmailApp.sendEmail(rowData.emailAddress, emailSubject, emailText,
{name: e.parameter.name,
attachments: attachments,
htmlBody: emailText,
cc: cc,
bcc: bcc,
inlineImages: inlineImages});

最佳答案

一些评论:

> var array = { item1, item2, item3 };

这在语法上是不正确的,数组文字应该是:

var array = [ item1, item2, item3 ];

[...]

> if (emailTemplate.search(/<\img/ != -1)) {

img 前的反斜杠是不必要的,该模式应该带有尾随空格并且不区分大小写会更好(因为 HTML 不区分大小写并且通常以大写字母显示标签名称),因此 /<img /i

> var imgVars = emailTemplate.match(/<img[^>]+>/g);

用正则表达式解析 HTML 不是一个好主意,最好将 HTML 转换为文档片段并进行处理。

>  var imgVars = emailTemplate.match(/<img[^>]+>/g);

请注意,String.prototype.match 返回一个数组。

> for (i in imgVars) {

出于多种原因,不建议将 for..in 与数组一起使用,例如成员可能不会以任何特定顺序返回(在不同的浏览器中可能不同)并且 for..in 将返回所有可枚举的数组的属性及其 [[Prototype]]所以如果你使用的浏览器有 Array.prototype由“垫片”或“猴子补丁”修改,那么这些属性也将被枚举,所以:

> var title = imgVars[i].match(/title="([^\"]+\")/);

很可能会尝试在其值为函数引用的属性上调用match,从而引发错误。至少应该包括一个 hasOwnProperty 测试,但最好只使用普通的 for 循环。

> for (j in attachments) {

attachments 似乎也是一个数组,所以出于与上述相同的原因,这里也使用普通的 for 循环。将 for..in(可能以意外顺序访问属性)与 splice 一起使用也不是一个好主意,这表明您需要特定的顺序。请注意,在某些浏览器中,for..in 将按照数组成员添加到数组的顺序访问数组成员,而不是数字顺序。其他浏览器将始终以特定顺序访问数字属性,但其他浏览器不会。

如果将 HTML 转换为文档片段,那么其中的大部分内容都会简单很多,然后可以使用 DOM 方法提取 img 元素并访问它们的属性以构建对象。然后,如果需要,可以使用 native 方法将对象转换为 JSON。

关于javascript - 将 JavaScript 数组转换为 JSON 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11750662/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com