从排除无穷大的对象数组中查找最小值/最大值

时间:2019-05-18 06:17:23

标签: javascript

我有一个对象数组,我想在其中找到每个对象中属性的最小/最大值。我目前有一种可以找到最小值的有效方法,但是我正在为最大值而苦苦挣扎,如果值是Infinity,我想忽略它。

let result = [

	{
    "id": "Foo 1",
    "result": Infinity
  },
  {
    "id": "Foo 2",

    "result": 240.77777777777777
  },
  {
    "id": "Foo 3",

    "result": 714.55
  },
  {
    "id": "Foo 4",
    "result": Infinity
  },
  {
    "id": "Foo 5",
    "result": 1314.55
  },
    {
    "id": "foo 6",
    "result": Infinity
  },
]

let minCount = result.reduce(function(max, obj) {
  return obj.result < max.result ? obj : max;
});
console.log("Min", minCount.result);
let maxCount = result.reduce(function(max, obj) {
  return obj.result > max.result ? obj : max;
});
console.log("Max", maxCount.result);

除非我有一个result的无穷大值,否则此代码适用于 我尝试将return设置为return isFinite(obj.result) > max.result ? obj : max;,但是一旦返回第一个Infinit值,它将获得它之前的值,并停止在函数的其余部分中寻找最大值。

我也尝试过return obj.result > isFinite(max.result) ? obj : max; 哪个相反,并找到最后一个值,而不考虑其无穷大。

如果使事情变得更容易,我可以将无穷大的值更改为undefined或其他原语,但是这些值不会影响我的最小/最大计算。

3 个答案:

答案 0 :(得分:0)

filter isFinite,然后传播到Math.minMath.max可能更容易:

let result = [
  {
    "id": "Foo 1",
    "result": Infinity
  },
  {
    "id": "Foo 2",
    "result": 240.77777777777777
  },
  {
    "id": "Foo 3",
    "result": 714.55
  },
  {
    "id": "Foo 4",
    "result": Infinity
  },
  {
    "id": "Foo 5",
    "result": 1314.55
  },
  {
    "id": "foo 6",
    "result": Infinity
  },
]

const numsOnly = result.map(({ result }) => result);
const min = Math.min(...numsOnly.filter(isFinite));
const max = Math.max(...numsOnly.filter(isFinite));
console.log('min', min, 'max', max);

如果需要对象以及最大值/最小值,请先按isFinite过滤对象:

let result = [
  {
    "id": "Foo 1",
    "result": Infinity
  },
  {
    "id": "Foo 2",
    "result": 240.77777777777777
  },
  {
    "id": "Foo 3",
    "result": 714.55
  },
  {
    "id": "Foo 4",
    "result": Infinity
  },
  {
    "id": "Foo 5",
    "result": 1314.55
  },
  {
    "id": "foo 6",
    "result": Infinity
  },
]

const finiteObjs = result.filter(({ result }) => isFinite(result));
const minObj = finiteObjs.reduce((a, b) => a.result < b.result ? a : b);
const maxObj = finiteObjs.reduce((a, b) => a.result > b.result ? a : b);
console.log('minObj', minObj, 'maxObj', maxObj);

答案 1 :(得分:0)

您可以稍微更改比较逻辑并使它起作用。看看这个:

const max = result.reduce((a,b)=>{
    return a > b.result && isFinite(a) ? a : (isFinite(b.result) ? b.result : a);
},0)

答案 2 :(得分:0)

对此进行确认

let result = [

	{
    "id": "Foo 1",
    "result": Infinity
  },
  {
    "id": "Foo 2",

    "result": 240.77777777777777
  },
  {
    "id": "Foo 3",

    "result": 714.55
  },
  {
    "id": "Foo 4",
    "result": Infinity
  },
  {
    "id": "Foo 5",
    "result": 1314.55
  },
    {
    "id": "foo 6",
    "result": Infinity
  },
]

let min=Number.MAX_VALUE;
let max=Number.MIN_VALUE;

result.forEach(item => {
  min = isFinite(item.result) ? Math.min(item.result,min): min;

max = isFinite(item.result) ? Math.max(item.result,max): max;

});

console.log('Min:', min);
console.log('Max:',max);

仅当您的数组包含至少一个min和Max值(有限值)时才有效