d3.js d3-在嵌套数组中查找最大键/值

9rygscc1  于 2022-11-12  发布在  其他
关注(0)|答案(3)|浏览(219)

我有一个由3个嵌套数组组成的数组,每个数组包含3个对象。我使用什么d3语法来找到所有数据中data 1的最大值?
是不是像,

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。谢谢你的帮助!!我不能完全得到它的权利。

k3fezbri

k3fezbri1#

我们可以混合使用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找到全局极大值。
第一个
如果您对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)));
dced5bon

dced5bon2#

最简单的方法可能是嵌套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属性。
请看下面的工作演示:
第一个
或者,您可以先使用d3.merge()将巢状数组合并为一个数组,然后将d3.max()套用至合并的数组。

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

以下是工作演示:
第一个

rggaifut

rggaifut3#

您可以Map内部的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);

相关问题