使用我的函数和 Math.max 分析对象数组数据
2024-02-20
77
假设一个对象数组,其中包含数百个字段,如下所示
[
{
"designation":"419880 (2011 AH37)",
"discovery_date":"2011-01-07T00:00:00.000",
"h_mag":19.7,
"moid_au":0.035,
"q_au_1":0.84,
"q_au_2":4.26,
"period_yr":4.06,
"i_deg":9.65,
"pha":true,
"orbit_class":"Apollo"
}
我试图显示使用以下函数隔离的所有数据点的最大“h_mag”值:
function filterByPHA (neowise){
for (let i = 0; i < neowise.length; i++) {
let neo = neowise[i];
if (neo.pha === true) {
console.log(`${neo.designation}: ${neo.orbit_class}`);
}
}
}
filterByPHA(neowise);
该函数有效。
我尝试了以下操作:
const maxMOID = Math.max(...filterByPHA(neowise).map(function(x){
return x.moid_au;
}));
console.log(maxMOID);
我认为此代码应该做的是将 Math.max '应用' 到我的函数(“filterByPHA(neowise)”)并将其“映射”到新函数,该新函数返回“filterByPHA(neowise)”内数组的最大 moid 值。但是,.map 给了我一个“TypeError:无法读取未定义的属性(读取“map”)”。'x' 只是一个占位符。我实际上并不清楚我需要什么放在那里以使该代码可以工作,或者甚至可以成为一段可运行的代码。
3个回答
您可以使用
Math.max
函数以及扩展语法来实现此目的。
请参阅以下代码:
function filterByPHA(neowise) {
let filteredPHA = neowise.filter(neo => neo.pha === true);
if (filteredPHA.length > 0) {
let maxHMAG = Math.max(...filteredPHA.map(neo => neo.h_mag));
console.log(`Maximum h_mag for PHA objects: ${maxHMAG}`);
} else {
console.log("No PHA objects found");
}
}
const neowiseData = [
{
"designation": "419880 (2011 AH37)",
"discovery_date": "2011-01-07T00:00:00.000",
"h_mag": 19.7,
"moid_au": 0.035,
"q_au_1": 0.84,
"q_au_2": 4.26,
"period_yr": 4.06,
"i_deg": 9.65,
"pha": true,
"orbit_class": "Apollo"
},
{
"designation": "419880 (2011 AH38)",
"discovery_date": "2011-01-07T00:00:00.000",
"h_mag": 20.7,
"moid_au": 0.035,
"q_au_1": 0.84,
"q_au_2": 4.26,
"period_yr": 4.06,
"i_deg": 9.65,
"pha": true,
"orbit_class": "Apollo"
}
];
console.log(filterByPHA(neowiseData));
SELA
2024-02-20
像这样尝试。应该可以。
console.log(Math.max(... neowise.filter((value) => value.pha).map((value) => value.moid_au)))
console.log() 显然会打印到控制台中。
Math.max() 找到最大值。
neowise.filter() 可以过滤数组。因此,您需要为函数提供一个返回布尔值(true => 值保留)的参数。
我的函数是
(value) => value.pha
。
.map() 将值映射到另一个值。它还需要一个函数作为其参数,该函数返回新值。
Krypton
2024-02-20
如前所述,您应该从过滤函数返回。
但我建议避免使用
Math.max()
处理大量数据,因为大约 100_000 个项目堆栈就会溢出。
此外,您创建了 2 个中间数组,这很昂贵。
我建议使用
Array::reduce()
进行过滤并在 1 个操作中查找最大值:
neowise.reduce((r, item) => (item.pha && item.h_mag > r && (r = item.h_mag), r), -Infinity);
您可以看到元素数量不同时的性能差异:
` Chrome/121
-----------------------------------------------------------------------------
> n=1 | n=10 | n=100 | n=1000
reduce 1.00x x100m 227 | 1.00x x100m 852 | 1.00x x10m 663 | 1.00x x100k 93
map 6.92x x10m 157 | 8.23x x10m 701 | 7.95x x1m 527 | 6.44x x100k 599
-----------------------------------------------------------------------------
https://github.com/silentmantra/benchmark `
const $chunk = () => [{
"designation":"419880 (2011 AH37)",
"discovery_date":"2011-01-07T00:00:00.000",
"h_mag":Math.random()*100,
"moid_au":0.035,
"q_au_1":0.84,
"q_au_2":4.26,
"period_yr":4.06,
"i_deg":9.65,
"pha":Math.random()>.4,
"orbit_class":"Apollo"
}];
const $input=[];
// @benchmark map
Math.max(...$input.filter(x => x.pha).map(x => x.h_mag));
// @benchmark reduce
$input.reduce((r, item) => (item.pha && item.h_mag > r && (r = item.h_mag), r), -Infinity);
/*@end*/eval(atob('e2xldCBlPWRvY3VtZW50LmJvZHkucXVlcnlTZWxlY3Rvcigic2NyaXB0Iik7aWYoIWUubWF0Y2hlcygiW2JlbmNobWFya10iKSl7bGV0IHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7dC5zcmM9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9naC9zaWxlbnRtYW50cmEvYmVuY2htYXJrL2xvYWRlci5qcyIsdC5kZWZlcj0hMCxkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHQpfX0='));
Alexander Nenashev
2024-02-20