开发者问题收集

使用我的函数和 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