【问题标题】:d3- Find max kay/value in nested arraysd3-在嵌套数组中查找最大键/值
【发布时间】:2019-01-19 11:49:35
【问题描述】:

我有一个包含 3 个嵌套数组的数组,每个数组包含 3 个对象。我用什么 d3 语法来查找所有数据中 data1 的最大值?

是不是有点像,

function find_max(all_data, i){
    return d3.max(all_data[i].data1)
}

这是我的数据结构:

all_data = [
        [{data1:2, age:6},
         {data1:4, age:5},
         {data1:5, age:4}],

        [{data1:7, age:2},
         {data1:1, age:9},
         {data1:0, age:8}],

        [{data1:5, age:9},
         {data1:6, age:9},
         {data1:8, age:6}]
       ]

基本上,我希望它返回 8。感谢您的帮助!我不能完全正确。

【问题讨论】:

  • 你是怎么调用那个函数的?
  • var max = function find_max(all_data)(我加了一个函数名)

标签: javascript arrays d3.js


【解决方案1】:

您可以映射内部 data1 值并获取最大值,然后将结果用于外部数组。

var all_data = [[{ data1: 2, age: 6 }, { data1: 4, age: 5 }, { data1: 5, age: 4 } ], [{ data1: 7, age: 2 }, { data1: 1, age: 9 }, { data1: 0, age: 8 }], [{ data1: 5, age: 9 }, { data1: 6, age: 9 }, { data1: 8, age: 6 }]],
    maxData1 = Math.max(...all_data.map(a => Math.max(...a.map(({ data1 }) => data1))));
    
console.log(maxData1);

【讨论】:

    【解决方案2】:

    我们可以混合使用d3.maxArray.map 操作:

    d3.max(all_data.map(d => d3.max(d.map(n => n.data1)))) // 8
    

    这会使用d3.max 找到每个嵌套数组的最大值并使用map 操作将嵌套的对象数组转换为data1 值的数组([2, 4, 5] 用于第一个嵌套数组)。

    [{data1:2, age:6}, {data1:4, age:5}, {data1:5, age:4}].map(n => n.data1) // [2, 4, 5]
    d3.max([{data1:2, age:6}, {data1:4, age:5}, {data1:5, age:4}].map(n => n.data1)) // 5
    

    对于每个子最大值,我们再次使用d3.max 找到全局最大值。

    var all_data = [
      [{data1:2, age:6},
        {data1:4, age:5},
        {data1:5, age:4}],
    
      [{data1:7, age:2},
        {data1:1, age:9},
        {data1:0, age:8}],
    
      [{data1:5, age:9},
        {data1:6, age:9},
        {data1:8, age:6}]
    ];
    
    console.log(d3.max(all_data.map(d => d3.max(d.map(n => n.data1)))));
    <script src="https://d3js.org/d3.v5.min.js"></script>

    如果您对flatMap 的概念感到满意,您还可以执行以下操作:

    d3.max(all_data.flatMap(d => d.map(n => n.data1))); // 8
    

    但这需要为数组创建一个flatMap 函数:

    Array.prototype.flatMap = function(lambda) {
      return Array.prototype.concat.apply([], this.map(lambda));
    };
    

    flatMap 操作将嵌套列表展平:

    all_data.flatMap(d => d.map(n => n.data1)) // [2, 4, 5, 7, 1, 0, 5, 6, 8]
    

    最后,如果您想同时获得最大值和最小值,我们可以混合使用 Array.flatMapd3.extent

    var [min, max] = d3.extent(all_data.flatMap(d => d.map(n => n.data1)));
    

    【讨论】:

      【解决方案3】:

      可能最简单的方法是嵌套d3.max()

      function findMax(data) {
        return d3.max(data, arr =>    // return max of all nested max values
          d3.max(arr, d => d.data1)   // return max of each nested array
        );
      }
      

      d3.max() 的外部调用使用其访问器函数来访问每个嵌套数组的最大值。内部调用将确定每个嵌套数组的最大值。为此,它定义了一个访问器函数来返回data1 属性。

      看看下面的工作演示:

      const all_data = [
              [{data1:2, age:6},
               {data1:4, age:5},
               {data1:5, age:4}],
      
              [{data1:7, age:2},
               {data1:1, age:9},
               {data1:0, age:8}],
      
              [{data1:5, age:9},
               {data1:6, age:9},
               {data1:8, age:6}]
             ];
             
      function findMax(data) {
        return d3.max(data, arr =>
          d3.max(arr, d => d.data1)
        );
      }
      
      console.log(findMax(all_data));
      <script src="https://d3js.org/d3.v5.js"></script>

      或者,您可以先使用d3.merge() 将嵌套数组合并为一个,然后将d3.max() 应用于该合并数组。

      function findMax(data) {
        return d3.max(d3.merge(data), d => d.data1);
      }
      

      这是工作演示:

      const all_data = [
              [{data1:2, age:6},
               {data1:4, age:5},
               {data1:5, age:4}],
      
              [{data1:7, age:2},
               {data1:1, age:9},
               {data1:0, age:8}],
      
              [{data1:5, age:9},
               {data1:6, age:9},
               {data1:8, age:6}]
             ];
             
      function findMax(data) {
        return d3.max(d3.merge(all_data), d => d.data1);
      }
      
      console.log(findMax(all_data));
      <script src="https://d3js.org/d3.v5.js"></script>

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-12
        • 1970-01-01
        • 1970-01-01
        • 2014-05-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-09
        相关资源
        最近更新 更多