我从服务器取回 json,我想将它变成一个数组,只是为了测试它是否可以工作
JSON.parse(response.data.blocks)
我明白了:
SyntaxError: Unexpected token o in JSON at position 1
at JSON.parse (<anonymous>)
at contentblocks.js?KHWUmpg:87149
at <anonymous>
如何将 block 转换为数组,以便我可以执行此操作:
let blocks = response.data.blocks.sort(function(a,b){
var x = a.order < b.order? -1:1
return x
})
我收到一个错误,排序不存在,所以我想我需要将 block 制作为数组,以便我可以对它们进行排序。
这是服务器返回的内容
{
"status": "success",
"blocks": {
"0": {
"id": 50,
"content_id": 25,
"type": "title-block-template",
"content": "yeah",
"content_type": null,
"template_block_id": 1,
"user_id": null,
"meta": null,
"created_at": "2017-08-13 17:27:53",
"updated_at": "2017-08-13 17:27:53",
"order": 1,
"settings": [
{
"id": 12,
"key": "order",
"value": "1",
"type": "integer",
"created_at": "2017-08-13 17:17:51",
"updated_at": "2017-08-13 17:17:51",
"pivot": {
"settingable_id": 50,
"setting_id": "12"
}
}
]
},
"1": {
"id": 51,
"content_id": 25,
"type": "images-block-template",
"content": "[]",
"content_type": null,
"template_block_id": 9,
"user_id": null,
"meta": null,
"created_at": "2017-08-13 17:27:53",
"updated_at": "2017-08-13 17:27:53",
"order": 3,
"settings": [
{
"id": 19,
"key": "order",
"value": "3",
"type": "integer",
"created_at": "2017-08-13 17:26:19",
"updated_at": "2017-08-13 17:30:24",
"pivot": {
"settingable_id": 51,
"setting_id": "19"
}
}
]
}
}
}
最佳答案
对对象的属性进行排序
不要将其视为对对象进行排序,而是提取属性(放入数组中)并按属性名称对它们进行排序。
假设您的原始对象(您在问题底部列出的对象)名为 server_return_object
。
使用将 block 提取到对象中
blocks = server_return_object.blocks;
现在我们需要 block 的键(“0”、“1”等)。使用Object.keys()
提取它们。
block_keys = Object.keys(blocks);
然后我们可以创建一个数组,每个 block 一个元素。最简单的方法是 .map()
函数,它获取一个项目列表并对它们执行一个函数。
block_array = block_keys.map( key => blocks[key] );
您现在在 block_array
中有一个 block 数组,然后您可以按照您喜欢的任何方式对其进行排序。例如,要按 created_at
排序,您可以使用
block_array.sort(function(a,b){return a.created_at > b.created_at } )
更改 sort() 内部的函数,以返回您想要排序的任何标准。如果是对其中一个属性进行简单排序,您可以将标准(如上所示)设置为大于(或小于,以另一种方式排序)的测试。使用多个标准也可以进行更复杂的排序。
关于javascript - 很难将 json 字符串从服务器转换为数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45663713/