【问题标题】:Get min and max of nested JSON object获取嵌套 JSON 对象的最小值和最大值
【发布时间】: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 来解决问题。 StackOverflow 期待您 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 不正确。

标签: javascript json max minimum


【解决方案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);

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-04-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多