如何将Math.max与对象数组一起使用
How do i use Math.max with an array of objects?
我想在对象数组中选择最大的数字,因此,例如,我想获得包含最大数字的x
属性(在本例中,maximum
应该是200
):
var myArr = [{x:100,y:200},{x:200,y:500}];
//does not work:
var maximum = Math.max.apply(Math,myArr.x);
您必须自己从对象中提取属性:
var maximum = Math.max.apply(Math, myArr.map(function(o) { return o.x; }));
它使用.map()
迭代数组的元素,并返回"x"属性的值。然后将该结果数组作为参数传递给Math.max()
。
既然=>
功能已经广泛可用,那么它会更短:
var maximum = Math.max.apply(Math, myArr.map(o => o.x));
当然,仍然在做几乎完全相同的事情。
还有一种方式,我觉得它更漂亮。通过使用排列:
Math.max(...array.map((i) => i.x));
var myArr = [{x:100,y:200},{x:200,y:500}];
function sortByKeyDesc(array, key) {
return array.sort(function(a, b) {
var x = a[key]; var y = b[key];
return ((x < y) ? 1 : ((x > y) ? -1 : 0));
});
}
console.log(sortByKeyDesc(myArr, "x")[0].x);
首先按键值降序排序,然后获得第一个对象的x
属性
如果你想用老式的方式:
function arrayMax(arr, key){
var m = -Infinity,
cur,
i;
for(i=0; i<arr.length; i++){
cur = arr[i][key]
if(cur > m){
m = cur;
}
}
return m;
}
此函数将对象数组作为第一个参数,将键作为第二个参数。它在数组上迭代,并返回为给定键找到的最大值。
在你的情况下,你会这样称呼它:
var maximum = arrayMax(myArr, "x");
请注意,与Math.max不同,这对于一个(或多个)对象没有定义该键的情况是有弹性的,因此:
arrayMax([{y:200}, {x:100, y:100}, {x:300, y:400}], "x");
将返回300
,而Math.max
返回NaN
(至少在Google chrome上)。在最坏的情况下(没有对象定义键),arrayMax
函数返回-Infintity
。
如果你想返回具有最大值的对象,而不是简单地返回值,你可以很容易地修改函数:
function arrayMax(arr, key){
var m = -Infinity,
o = null,
cur,
curv,
i;
for(i=0; i<arr.length; i++){
cur = arr[i]
curv = cur[key]
if(curv > m){
m = curv;
o = cur;
}
}
return o;
}
您需要将对象数组映射到数字数组:
Math.max.apply(Math,myArr.map(function(o){return o.x;}))
你最好不要使用Math.max。
MDN警告说,如果数组中的元素过多,.apply
可能无法工作。我不知道"太多"是什么意思。
如果你想安全,可以使用这样的东西:
const maxReduced = myArr
.map(obj => {
return obj.x;
})
.reduce((a, b) => (a.x > b.x ? a : b));
MDN警告
但是,spread(…)和apply都将失败或返回如果数组中的元素太多,则会出现错误的结果,因为它们试图将数组元素作为函数参数传递。请参阅使用应用程序和内置函数了解更多详细信息。reduce解决方案没有这个问题。
const maximum = myArr.reduce((s, obj)=>{
return Math.max(s, obj.x)
}, 0)
原因-
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/max由于spread(…)和apply试图将数组元素作为函数参数传递,因此如果数组的元素过多,则它们将失败或返回错误的结果。有关更多详细信息,请参阅使用应用程序和内置函数。reduce解决方案不存在此问题
- 高亮显示与数组字符串一起使用时文本插件中断
- 将推入式数组与for一起使用..在..循环中
- 将代理与纯数组一起使用
- 将数组原型函数与非数组一起使用
- 将 JavaScript new 关键字与可变长度参数数组一起使用
- 如何将Math.max与对象数组一起使用
- 将拼接与字符串数组一起使用
- 将Slice与Knockout创建的数组一起使用's映射插件
- 将元素中包含的内容与数组一起添加
- 尝试将IF语句与数组一起使用时遇到问题
- RegExp用于验证不与数组一起工作的网站URL
- 正在尝试将Google Visualization API中的addRows()与数组数组一起使用JavaScript/
- Javascript数组一起改变
- jQuery map不能与json数组一起工作
- D3.js直方图不能与每个箱子的总频率数组一起工作
- MongoDB将$in与对象数组一起使用
- 如何将fullcalendar addeventsource与数组一起使用
- 如何将 _.each 与对象或多维数组一起使用
- encodeuriccomponent不能与数组一起工作
- AngularJS:如何将ngRepeat指令与数组和子数组一起使用