如何用一行JavaScript代码获取复数数组元素的最大模长?
如何简洁找出复数数组元素模长的最大值?
我们知道,获取普通数组的最大值可以用这样的简便写法:
Math.max.apply(null, myArray)
但如果数组中存储的是复数对象,每个对象都带有计算模长的magnitude()方法,有没有简洁的一行代码能找出所有元素模长的最大值?我清楚可以用循环或自定义函数实现,但推测JavaScript应该有更简洁的一行解决方案。
以下是相关代码片段:
function Complex(re, im) { this.real = re; this.imag = im; } Complex.prototype.magnitude = function() { return Math.sqrt(this.real * this.real + this.imag * this.imag); }; var a = new Array(1, 2, 3); ra = Math.max.apply(null, a); // 正常运行 var b = new Array(new Complex(1, 2), new Complex(1, 3), new Complex(1, 4)); rb = Math.max.apply(null, b) console.log(ra) console.log(rb) // 不出意外会得到NaN
简洁解决方案
1. 结合map与Math.max
先通过map将每个复数对象转换为对应的模长,再用熟悉的方法取最大值:
// ES5写法 var maxMagnitude = Math.max.apply(null, b.map(function(c) { return c.magnitude(); })); // ES6扩展运算符更简洁 const maxMagnitude = Math.max(...b.map(c => c.magnitude()));
2. 使用reduce直接遍历计算
不需要生成中间模长数组,直接在遍历过程中比较并记录最大模长,适合大数据量场景:
// 直接计算最大模长 const maxMagnitude = b.reduce((currentMax, complex) => { const mag = complex.magnitude(); return mag > currentMax ? mag : currentMax; }, -Infinity); // 或者更紧凑的一行写法 const maxMagnitude = b.reduce((max, c) => Math.max(max, c.magnitude()), -Infinity);
内容的提问来源于stack exchange,提问作者Denis Cousineau
相关产品推荐
相关产品推荐

