我正在使用应用程序脚本并具有:
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:
在此模式中,通过将 00A0
与 String.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/