获取嵌套 JSON 对象的最小值和最大值

Posted

技术标签:

【中文标题】获取嵌套 JSON 对象的最小值和最大值【英文标题】:Get min and max of nested JSON object 【发布时间】:2019-05-08 00:04:55 【问题描述】:

我有一个嵌套的 json 对象,看起来像---

      [
      "key":"AXCG","values":[
        "interval":'1_to_2years',"value":34,
        "interval":'3_to_4years',"value":12,
        "interval":'5_to_6years',"value":45,
      ],
      "key":"BDGT","values":[
        "interval":'1_to_2years',"value":194,
        "interval":'3_to_4years',"value":12,
        "interval":'5_to_6years',"value":45,
      ],
"key":"YTEF","values":[
        "interval":'1_to_2years',"value":0,
        "interval":'3_to_4years',"value":12,
        "interval":'5_to_6years',"value":15,
      ]]

我想找到值中的最小值和最大值。就像在这种情况下,它会是最小值 0 和最大值 194。我该怎么做?

【问题讨论】:

发布的问题似乎根本没有包含any attempt 来解决问题。 *** 期待您 try to solve your own problem first,因为您的尝试有助于我们更好地了解您想要什么。请编辑问题以显示您尝试过的内容,以说明您遇到minimal reproducible example 的特定障碍。欲了解更多信息,请参阅How to Ask 并拨打tour。 Array.reduce 就是你要找的。​​span> 顺便说一句,没有“JSON 对象”(或“JSON 数组”)之类的东西。 JSON 是一些数据结构的文本表示。 JSON 的格式类似于 javascript 语言,但它没有以任何方式链接到 JavaScript。 JSON 可以用多种语言处理。从您的问题中不清楚您发布的是 JSON 还是 JavaScript 对象数组。由于它不是有效的 JSON,我认为它是一个 JavaScript 片段,并且附加到问题的标签 json 不正确。 【参考方案1】:

在下面找到您的用例的代码,

'use strict'
const collection = [
    
        "key": "AXCG", "values": [
             "interval": '1_to_2years', "value": 34 ,
             "interval": '3_to_4years', "value": 12 ,
             "interval": '5_to_6years', "value": 45 ,
        ]
    ,
    
        "key": "BDGT", "values": [
             "interval": '1_to_2years', "value": 194 ,
             "interval": '3_to_4years', "value": 12 ,
             "interval": '5_to_6years', "value": 45 ,
        ]
    ,
    
        "key": "YTEF", "values": [
             "interval": '1_to_2years', "value": 0 ,
             "interval": '3_to_4years', "value": 12 ,
             "interval": '5_to_6years', "value": 15 ,
        ]
    ]
const list = []
collection.every(e => e.values.every(e2 => list.push(e2.value)));

console.log('Max Value:: ' + Math.max.apply(null, list)); // 194
console.log('Min Value:: ' + Math.min.apply(null, list)); // 0

【讨论】:

【参考方案2】:

var collection = [
    
        "key": "AXCG", "values": [
             "interval": '1_to_2years', "value": 34 ,
             "interval": '3_to_4years', "value": 12 ,
             "interval": '5_to_6years', "value": 45 ,
        ]
    ,
    
        "key": "BDGT", "values": [
             "interval": '1_to_2years', "value": 194 ,
             "interval": '3_to_4years', "value": 12 ,
             "interval": '5_to_6years', "value": 45 ,
        ]
    ,
    
        "key": "YTEF", "values": [
             "interval": '1_to_2years', "value": 0 ,
             "interval": '3_to_4years', "value": 12 ,
             "interval": '5_to_6years', "value": 15 ,
        ]
    
];


var values = [];

collection.forEach(function (item) 
    item.values.forEach(function (nestedItem) 
        values.push(nestedItem.value);
    );
);

console.log("Min:" + Math.min.apply(Math, values)); // Min:0
console.log("Max:" + Math.max.apply(Math, values)); // Max:194

【讨论】:

【参考方案3】:

使用 Array.forEach 的简单想法的另一种变体:

    var o = [
        
            "key": "AXCG", "values": [
                 "interval": '1_to_2years', "value": 34 ,
                 "interval": '3_to_4years', "value": 12 ,
                 "interval": '5_to_6years', "value": 45 ,
            ]
        ,
        
            "key": "BDGT", "values": [
                 "interval": '1_to_2years', "value": 194 ,
                 "interval": '3_to_4years', "value": 12 ,
                 "interval": '5_to_6years', "value": 45 ,
            ]
        ,
        
            "key": "YTEF", "values": [
                 "interval": '1_to_2years', "value": 0 ,
                 "interval": '3_to_4years', "value": 12 ,
                 "interval": '5_to_6years', "value": 15 ,
            ]
        ];
    var minimum = 9999;
    var maximum = 0;


    o.forEach(function (element) 
        var inner = element.values;
        inner.forEach(function (innerELement) 
            if (innerELement.value < minimum) minimum = innerELement.value;
            if (innerELement.value > maximum) maximum = innerELement.value;
        );
    );


    console.log('Min is ' + minimum + ' and max is ' + maximum);

【讨论】:

【参考方案4】:

您可以使用array#reduce 来获取valuevalues 数组中的最小值和最大值。遍历values数组的每个对象,并将值与存储的最小值和最大值进行比较,当遇到新的最小值和最大值时更新存储的值。

var collection = [ "key": "AXCG", "values": [ "interval": '1_to_2years', "value": 34 ,  "interval": '3_to_4years', "value": 12 ,  "interval": '5_to_6years', "value": 45 , ] ,  "key": "BDGT", "values": [ "interval": '1_to_2years', "value": 194 ,  "interval": '3_to_4years', "value": 12 ,  "interval": '5_to_6years', "value": 45 , ] ,  "key": "YTEF", "values": [ "interval": '1_to_2years', "value": 0 ,  "interval": '3_to_4years', "value": 12 ,  "interval": '5_to_6years', "value": 15, ]  ],
    result = collection.reduce((r,values) => 
      values.forEach((value) => 
        r.min = r.min > value ? value : r.min;
        r.max = r.max < value ? value : r.max;
      );
      return r;
    ,min: Number.MAX_SAFE_INTEGER, max: Number.MIN_SAFE_INTEGER);
console.log(result);

【讨论】:

以上是关于获取嵌套 JSON 对象的最小值和最大值的主要内容,如果未能解决你的问题,请参考以下文章

从变量中获取最小值和最大值的正确方法

获取对象属性中的最小值/最大值的快速方法

SQL:在一列中获取最小值和最大值

如何获取集群的最小值和最大值

获取数组列中的最小值和最大值

使用递归js在树状对象中查找最小值和最大值