JS Fetch JSON 解析正在修改对象
JS Fetch JSON parse is modifying object
我在 fetch 中遇到过这种奇怪的行为。
首先看一下长度(正确)和实际结构的截图:console screenshot
考虑以下来自服务器的 json 响应,其中 likes
数组显然包含一个对象,而 comments
数组包含两个:
{
"status":"success",
"payload":{
"272699880986":{
"likes":[
{
"createdTime":"2016-11-07T04:41:21.000Z",
"senderId":10209615042475034,
"senderName":"Alfredo Re",
"likes":1
}
],
"comments":[
{
"createdTime":"2016-11-07T04:41:54.000Z",
"senderId":1021426764639564,
"senderName":"Alfredo J. Re",
"comments":1
},
{
"createdTime":"2016-11-07T04:41:24.000Z",
"senderId":10209615042475034,
"senderName":"Alfredo Re",
"comments":1
}
]
}
}
}
现在,通过整个 response.json()
传递该响应,如下所示:
fetch('http://example.com/entries.json', {
method: 'GET',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
...authKeys,
}
})
.then(response => {
switch(response.status){
case 200:
console.log('status 200', response)
return response.json()
}
})
.then(json => {
console.log('parsed response')
console.log(json)
})
得到以下结果:
{
"status":"success",
"payload":{
"272699880986":{
"likes":[
{
"createdTime":"2016-11-07T04:41:54.000Z",
"senderId":1021426764639564,
"senderName":"Alfredo J. Re",
"likes": 1,
"comments":1
},
{
"createdTime":"2016-11-07T04:41:24.000Z",
"senderId":10209615042475034,
"senderName":"Alfredo Re",
"comments":1
}
],
"comments":[
{
"createdTime":"2016-11-07T04:41:54.000Z",
"senderId":1021426764639564,
"senderName":"Alfredo J. Re",
"comments":1
},
{
"createdTime":"2016-11-07T04:41:24.000Z",
"senderId":10209615042475034,
"senderName":"Alfredo Re",
"comments":1
}
]
}
}
}
看看它是如何混淆 likes
和 comments
集合的。这让我发疯了。我错过了什么吗?
更新
这里的 a gif showing chrome's console 列表显示了一个包含一个对象的数组,另一个包含两个对象的数组。当我点击前者时,它变成了一个包含两个对象的数组!这让我感到困惑
好吧,我发现它实际上是 lodash 的 _.merge()
在获取它们之后改变我的对象的方式。我正在使用 lodash 根据 senderId
键合并两个集合(喜欢和评论)。
仅作记录,我最终改用了这种方法:
我在 fetch 中遇到过这种奇怪的行为。
首先看一下长度(正确)和实际结构的截图:console screenshot
考虑以下来自服务器的 json 响应,其中 likes
数组显然包含一个对象,而 comments
数组包含两个:
{
"status":"success",
"payload":{
"272699880986":{
"likes":[
{
"createdTime":"2016-11-07T04:41:21.000Z",
"senderId":10209615042475034,
"senderName":"Alfredo Re",
"likes":1
}
],
"comments":[
{
"createdTime":"2016-11-07T04:41:54.000Z",
"senderId":1021426764639564,
"senderName":"Alfredo J. Re",
"comments":1
},
{
"createdTime":"2016-11-07T04:41:24.000Z",
"senderId":10209615042475034,
"senderName":"Alfredo Re",
"comments":1
}
]
}
}
}
现在,通过整个 response.json()
传递该响应,如下所示:
fetch('http://example.com/entries.json', {
method: 'GET',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
...authKeys,
}
})
.then(response => {
switch(response.status){
case 200:
console.log('status 200', response)
return response.json()
}
})
.then(json => {
console.log('parsed response')
console.log(json)
})
得到以下结果:
{
"status":"success",
"payload":{
"272699880986":{
"likes":[
{
"createdTime":"2016-11-07T04:41:54.000Z",
"senderId":1021426764639564,
"senderName":"Alfredo J. Re",
"likes": 1,
"comments":1
},
{
"createdTime":"2016-11-07T04:41:24.000Z",
"senderId":10209615042475034,
"senderName":"Alfredo Re",
"comments":1
}
],
"comments":[
{
"createdTime":"2016-11-07T04:41:54.000Z",
"senderId":1021426764639564,
"senderName":"Alfredo J. Re",
"comments":1
},
{
"createdTime":"2016-11-07T04:41:24.000Z",
"senderId":10209615042475034,
"senderName":"Alfredo Re",
"comments":1
}
]
}
}
}
看看它是如何混淆 likes
和 comments
集合的。这让我发疯了。我错过了什么吗?
更新
这里的 a gif showing chrome's console 列表显示了一个包含一个对象的数组,另一个包含两个对象的数组。当我点击前者时,它变成了一个包含两个对象的数组!这让我感到困惑
好吧,我发现它实际上是 lodash 的 _.merge()
在获取它们之后改变我的对象的方式。我正在使用 lodash 根据 senderId
键合并两个集合(喜欢和评论)。
仅作记录,我最终改用了这种方法: