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 降序

Arrays.sort() java中的排序方法 如果是对象的话可以自己写比较器compare()自己定义比较对象中的某个属性 参考技术A 你是要在客户端用js来做,还是服务端用java做?追问

服务器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】:

您可以使用sortfind

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 如何按值排序 自定义比较函数 比较对象某个字段

JS对象数组多条件排序

如何实现Java中hashmap的value值是对象的时候的排序

如何按嵌套值对复杂对象进行排序

根据Value对Map中的对象进行排序

Java中如何对Map的value或者key排序