javascript - 应用程序脚本中出现意外的 map 结果

标签 javascript google-apps-script

我正在使用应用程序脚本并具有:

var json = UrlFetchApp.fetch(url);
var objArray = JSON.parse(json) 
Logger.log(objArray);    
const indices = objArray.map(({ ' #':id }) => id);
Logger.log(indices);

Logger.log(objArray) 给出:

[{ #=4626,  E=Yes,  Assd $=,  Eager=High,  New $=,  State=Louisiana,  Date=06/15/20,  County=St. Martin Parish}, { #=4623,  State=South Carolina,   E=Yes,  Acres=1.50,  Eager=Low,   Date=06/15/20,  New $=}, { County=Sedgwick County,  Eager=High,  Acres=0.13,  New $=,  E=No, #=4620,  Date=06/15/20,  State=Kansas}, ....

Logger.log(indices) 给出:

[null, null, ....... null]

但是以下情况:

const values = [
 { " #": "4596", " E": "Yes"},
 { " #": "4597", " E": "No"},
 { " #": "4598", " E": "Maybe"},

]

 const indices = values.map(({ " #" : id }) => id);

 console.log(indices);

在应用程序脚本中运行时会产生:

[4596,4597,4598]

为什么第一个不起作用?

编辑:

json:

 [{" #":"4626"," E":"Yes"," Date":"06/15/20"," County":"St. Martin Parish"," State":"Louisiana"," Acres":"15.00","  Eager":"High"},{" #":"4623"," E":"Yes"," Date":"06/15/20"," County":"Greenville County"," State":"South Carolina"," Acres":"1.50","Eager":"Low"},

最佳答案

这个答案怎么样?

问题和解决方法:

从您回复的URL中,我可以了解您问题的原因。当从 https://ssjbhokibi.execute-api.us-east-1.amazonaws.com/dev/hello/get 的 URL 检索值时,我可以确认像您的示例一样的值输入值,也确认同样的情况。当我检查字符时,我可以确认 #中的 不是0020的空格,而是00A0是不间断空间。我认为这就是您问题的原因。

此外,UrlFetchApp.fetch(url) 检索到的值是 HTTPResponse 类的对象。因此,在此修改中,使用 getContentText() 来检索文本值。

为了解决您的问题,进行以下修改如何?

模式 1:

在此模式中,通过将 0020 替换为 00A0 来修改您的脚本。

来自:

var json = UrlFetchApp.fetch(url);
var objArray = JSON.parse(json) 
const indices = objArray.map(({ ' #':id }) => id);

致:

var json = UrlFetchApp.fetch(url);
var objArray = JSON.parse(json.getContentText());
const indices = objArray.map(({ ' #':id }) => id);
  • 当我直接使用00A0(如'#')发布上述修改后的脚本时,似乎00A0自动更改为0020 由 Markdown 渲染。所以在这种情况下,当你直接查看我的答案的来源时,你可以看到使用 00A0 修改后的脚本。
  • 但在这种情况下,我认为修改后的脚本的可读性可能会很低。所以我想再提出一种模式如下。

模式 2:

在此模式中,通过将 00A0String.fromCharCode(160) 转换来创建键,并检索值。

来自:

var json = UrlFetchApp.fetch(url);
var objArray = JSON.parse(json) 
const indices = objArray.map(({ ' #':id }) => id);

致:

var json = UrlFetchApp.fetch(url);
var objArray = JSON.parse(json.getContentText());
const indices = objArray.map(({[String.fromCharCode(160) + "#"]: id}) => id);

var json = UrlFetchApp.fetch(url);
var objArray = JSON.parse(json.getContentText());
const indices = objArray.map(e => e[String.fromCharCode(160) + "#"]);

注意:

  • 在示例输入值中,0020 用于表示 #。所以我没能注意到这一点。但是,当我使用 ' #'00A0 更新答案时,我注意到 00A0 自动更改为 0020 。另一方面,我可以确认,当通过单击编辑按钮确认来源时,' #' 使用00A0。另外,当我确认你的问题来源时,可以确认[{" #":"4626",的空格使用00A0。当我测试这个渲染 Markdown 时,我注意到似乎当运行 Markdown 渲染时,00A0 会更改为 0020,即使这是在脚本中编写的。这样,我无法从您添加的示例输入值中注意到该问题。从这个情况来看,我认为之前发布的相同问题可能也有与此相同的情况,这可能是重点。

引用文献:

关于javascript - 应用程序脚本中出现意外的 map 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62399683/

相关文章:

google-apps-script - 如何下载(导出)应用程序脚本附加项目?

google-apps-script - 有没有办法为 Google Drive 文件夹中的所有视频添加水印?

javascript - 有没有更好的方法使用 jQuery 附加 HTML

javascript - Jquery插件写入: How do I use the options in my code?

javascript - 在 Laravel 应用程序中使用 Javascript 进行表单验证

javascript - 获取工作表的范围,直到包含数据的最后一个单元格

javascript - 通过简单的 HTML 表单将基本数据添加到 Google 电子表格

javascript - Knockoutjs 从 Id 引用对象

google-apps-script - 使用 GAS 和 API 创建自定义 "from"发送别名

google-apps-script - 计算特定工作表上的评论数量