我有一个对象数组,我想在其中找到每个对象中属性的最小/最大值。我目前有一种可以找到最小值的有效方法,但是我正在为最大值而苦苦挣扎,如果值是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
或其他原语,但是这些值不会影响我的最小/最大计算。
答案 0 :(得分:0)
用filter
isFinite
,然后传播到Math.min
或Math.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值(有限值)时才有效