我有一个包含 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。感谢您的帮助!!我不太清楚。
最佳答案
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.flatMap
和 d3.extent
。 :
var [min, max] = d3.extent(all_data.flatMap(d => d.map(n => n.data1)));
关于javascript - d3- 在嵌套数组中查找最大键/值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51810621/