【问题标题】:javascript d3 get the biggest value from a multi-nested array/object datasetjavascript d3 从多嵌套数组/对象数据集中获取最大值
【发布时间】:2014-01-16 21:28:58
【问题描述】:

我将如何减少一堆深度嵌套的数组并获得某些键的最大价值? 这是我的数据格式:

var data = [
{
"category": "Cat 1",
"subcategories": [
  {
    "subcategory": "Subcate 1 a",
    "problems": [
      {
        "problem": "Problem 1 a 1",
        "total": 3,
        "breakdown": {
          "moderate": 1,
          "severe": 2
        }
      },
      {
        "problem": "Problem 1 a 2",
        "total": 6,
        "breakdown": {
          "moderate": 5,
          "severe": 1
        }
      }
    ]
  }
]
},
{
"category": "Cat 2",
"subcategories": [
  {
    "subcategory": "Subcate 2 a",
    "problems": [
      {
        "problem": "Problem 2 a 1",
        "total": 8,
        "breakdown": {
          "moderate": 5,
          "severe": 3
        }
      }
    ]
  },
  {
    "subcategory": "Subcat 2 b",
    "problems": [
      {
        "problem": "Problem 2 b 1",
        "total": 4,
        "breakdown": {
          "moderate": 1,
          "severe": 3
        }
      },
      {
        "problem": "Problem 2 b 2",
        "total": 2,
        "breakdown": {
          "moderate": 2,
          "severe": 0
        }
      }
    ]
  }
]
}
]

如何获得“中等”和“严重”的每个值的数组?所以在这个例子中我需要

[1,2,5,1,5,3,1,3,2,0]

然后我想做 d3.max(array) 以从中获得最大的价值。

【问题讨论】:

    标签: javascript arrays d3.js reduce


    【解决方案1】:

    这是有效的fiddle 。只需将对象转换为数组,如下所示:

     var array = $.map(data, function(value, index) {
                return [value];
        });
    
    var arr =[];
    
    for(var key in array)
    {
        var subcategories = array[key]['subcategories'];
      for(var j in subcategories)
      {    
          var prob = subcategories[j]['problems'];
          for(var i in prob)
          {
               var moderate = prob[i]['breakdown']['moderate'];
               var severe = prob[i]['breakdown']['severe'];
               arr.push(moderate);
               arr.push(severe);
           }
       }
    }
    alert(arr); //required array
    var max = d3.max(arr) //required max value
    

    并循环遍历它并将值保存到最终数组中!

    【讨论】:

    • 确实完成了这项工作,谢谢你们的意见。
    • 虽然这确实可以正常工作,但我最初发布了这个问题,因为我想知道是否有办法避免在 for 循环中执行 for 循环。我一直在玩复杂的 reduce 函数,但无法完全破解它。
    【解决方案2】:

    这有点啰嗦,但它可能有效:

    var array = new Array();
    for (var h=0; h<data.length; h++){
        for (var i=0; i<data[h].length; i++){
            for (var j=0; j<data[h].subcategories[i].length; j++){
                for (var k=0; k<data[h].subcategories[i].problems[j].length; k++){
                    array.push(data[h].subcategories[i].problems[j].breakdown.moderate);
                    array.push(data[h].subcategories[i].problems[j].breakdown.severe);
                }
            }
        }
    }
    //Then get the max of array
    

    我可能在某个地方犯了一个错误,但您可以使用这个总体思路来产生所需的结果。

    【讨论】:

      【解决方案3】:

      为了传递深度嵌套的 json 使用 jsonpath jQuery 插件

      Fiddle

      JS

      var mod=jsonPath(data, '$..subcategories..problems..moderate');
      var path=mod.concat(jsonPath(data, '$..subcategories..problems..severe'));
      $("#max").html(d3.max(path));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-14
        • 2014-03-12
        • 1970-01-01
        • 2013-10-11
        • 1970-01-01
        • 2021-09-21
        • 2021-11-29
        • 2017-05-06
        相关资源
        最近更新 更多