json对象排序把key中的value值排序
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了json对象排序把key中的value值排序相关的知识,希望对你有一定的参考价值。
json是这样的["name":"zhangsan","age":"15","name":"lisi","age":"12","name":"wangwu","age":"18"]
把key值 age中的value 降序
服务器JAVA做
追答我这个作法需要依赖外来包 jackson,用来解析json的,这样最稳定,效果最好,如下:
List> list = new ObjectMapper().readValue(jsonStr, List.class);
List ageList = new ArrayList();
for (Map map : list)
ageList.add(Integer.parseInt((String)map.get("age")));
Collections.sort(ageList);
Collections.reverse(ageList);
// ageList就是已经排序好的年龄了,如果有其他需要,你也可以在上面加东西
如果是arraylist 我该怎么排序呢, ??? 还是 name age
追答没明白你的追问是什么意思,直接性的排序都可以用Collections.sort完成
追问arraylist a = new arraylist();
这里的封装的key和value,我怎么按age的值排序。
哦,你是已经对象化了啊,这个更简单了
Collections.sort(list, new Comparator()
public int compare(User o1, User o2)
return o2.getAge()>o1.getAge();
);
那个值是Double的可以排吗?? 方便把你QQ给我吗?? 谢谢
追答Double的也行,数字型的都可以直接用 > 比较
你可以用百度Hi我……
double 的不能做比较啊转成int会损失精度的, 只有int能, 大哥我百度hi你了, 你没反应啊, 帮帮我 谢谢啦 、
追答double不要转int啊,double就按double来处理就行,回你了
本回答被提问者采纳如何按嵌套值对复杂对象进行排序
【中文标题】如何按嵌套值对复杂对象进行排序【英文标题】:How to sort a complex object by a nested value 【发布时间】:2019-07-02 22:44:05 【问题描述】:我在尝试对复杂对象进行排序时遇到问题。这是对象结构:
[
"searchResultProperties": [
"key": "message_time",
"value": 1542088800000
,
"key": "size_byte AVG",
"value": 480
,
"key": "source_file",
"value": "log"
,
"key": "source_host",
"value": "lab8.domain.com"
],
"show": false,
"key": null,
"type": null
,
"searchResultProperties": [
"key": "message_time",
"value": 1542096000000
,
"key": "size_byte AVG",
"value": 373
,
"key": "source_file",
"value": "log"
,
"key": "source_host",
"value": "lab8.domain.com"
],
"show": false,
"key": null,
"type": null
,
"searchResultProperties": [
"key": "message_time",
"value": 1542103200000
,
"key": "size_byte AVG",
"value": 683
,
"key": "source_file",
"value": "log"
,
"key": "source_host",
"value": "lab8.domain.com"
],
"show": false,
"key": null,
"type": null
]
基本上它是一个对象数组,具有一个名为“searchResultProperties”的属性,该属性是一个具有“key”和“value”属性的对象数组。
我正在尝试对“key”属性进行排序,即:“size_byte AVG”。
【问题讨论】:
您能否也发布您的尝试? 不清楚。您是想按其中一个属性对数组中的对象进行排序,还是想对对象的属性进行排序,这似乎很奇怪? 我想根据 tue 属性之一对数组中的对象进行排序。 【参考方案1】:您可以使用Array.prototype.sort()
函数为您提供两个对象,并且您可以根据您的排序逻辑返回一个+ve 或-ve 值。参考[https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort]
array = [
"searchResultProperties": [
"key": "message_time",
"value": 1542088800000
,
"key": "size_byte AVG",
"value": 480
,
"key": "source_file",
"value": "log"
,
"key": "source_host",
"value": "lab8.domain.com"
],
"show": false,
"key": null,
"type": null
,
"searchResultProperties": [
"key": "message_time",
"value": 1542096000000
,
"key": "size_byte AVG",
"value": 373
,
"key": "source_file",
"value": "log"
,
"key": "source_host",
"value": "lab8.domain.com"
],
"show": false,
"key": null,
"type": null
,
"searchResultProperties": [
"key": "message_time",
"value": 1542103200000
,
"key": "size_byte AVG",
"value": 683
,
"key": "source_file",
"value": "log"
,
"key": "source_host",
"value": "lab8.domain.com"
],
"show": false,
"key": null,
"type": null
]
array = array.sort((a,b) => a.searchResultProperties.find(obj => obj.key === "size_byte AVG").value - b.searchResultProperties.find(obj => obj.key === "size_byte AVG").value )
console.log(array);
【讨论】:
我正在写一个答案,同时想快速回复,以便作者自己尝试 仍然没有解释为什么你的代码可以帮助 OP 以及 OP 做错了什么 @CalvinNunes OP 没有分享他的代码。所以我永远不能说他做错了什么! 代码有帮助,因为它可以工作并且可以排序!它是一条线的解决方案!当代码自己说话时,你为什么要指望我写一篇文章! 好的,现在你有一个解释你的代码做什么的文本,并帮助 OP 理解你的代码的使用。【参考方案2】:您可以使用sort
和find
sort 接受两个值作为参数。通过 find 我们找到键为 'size_byte AVG'
的数组元素并从中取出值并比较值
let arr = ["searchResultProperties": ["key": "message_time","value": 1542088800000, "key": "size_byte AVG","value": 480, "key": "source_file", "value": "log", "key": "source_host","value": "lab8.domain.com"],"show": false,"key": null, "type": null, "searchResultProperties": ["key": "message_time","value": 1542096000000, "key": "size_byte AVG","value": 373, "key": "source_file","value": "log", "key": "source_host","value": "lab8.domain.com"],"show": false,"key": null, "type": null, "searchResultProperties": ["key": "message_time","value": 1542103200000, "key": "size_byte AVG","value": 683 , "key": "source_file","value": "log", "key": "source_host","value": "lab8.domain.com"],"show": false,"key": null,"type": null]
let op = arr.sort((a,b)=>
a.searchResultProperties.find(e=>e.key==='size_byte AVG').value -
b.searchResultProperties.find(e=>e.key==='size_byte AVG').value)
console.log(op)
【讨论】:
谢谢!但这个不适用于“source_file”字段,因为它不是 int。 @Pennywise83 现在可以根据需要轻松修改,不是吗?顺便说一句,如果您希望两者都适用,可以使用Intl.collator
。【参考方案3】:
您可以使用函数find
查找键为size_byte AVG
的对象,并使用函数sort
对数组进行排序。
这种方法按升序排序
let arr = [ "searchResultProperties": [ "key": "message_time", "value": 1542088800000 , "key": "size_byte AVG", "value": 480 , "key": "source_file", "value": "log" , "key": "source_host", "value": "lab8.domain.com" ], "show": false, "key": null, "type": null, "searchResultProperties": [ "key": "message_time", "value": 1542096000000 , "key": "size_byte AVG", "value": 373 , "key": "source_file", "value": "log" , "key": "source_host", "value": "lab8.domain.com" ], "show": false, "key": null, "type": null, "searchResultProperties": [ "key": "message_time", "value": 1542103200000 , "key": "size_byte AVG", "value": 683 , "key": "source_file", "value": "log" , "key": "source_host", "value": "lab8.domain.com" ], "show": false, "key": null, "type": null],
target = "size_byte AVG",
compare = (a, b) => a.find((key) => key === target).value - b.find((key) => key === target).value,
sorted = arr.sort((searchResultProperties: a, searchResultProperties: b) => compare(a, b));
console.log(sorted);
.as-console-wrapper max-height: 100% !important; top: 0;
【讨论】:
以上是关于json对象排序把key中的value值排序的主要内容,如果未能解决你的问题,请参考以下文章
C++ std::map sort 如何按值排序 自定义比较函数 比较对象某个字段