Javascript 获取数组中最长的路径,函数式
我有一个SVG线数组,表示三角形的边,我想给最长的一条(斜边)上色。假设Javascript 获取数组中最长的路径,函数式,javascript,svg,functional-programming,geometry,Javascript,Svg,Functional Programming,Geometry,我有一个SVG线数组,表示三角形的边,我想给最长的一条(斜边)上色。假设ab,bc和ca是SVG行元素 var hypotenuse = [ab, bc, ca].sort(getLineLength)[0]; hypotenuse.setAttribute("stroke-width", 5); function getLineLength(el) { var x1 = el.getAttribute("x1"); var x2 = el.getAttribute("x2")
ab
,bc
和ca
是SVG行
元素
var hypotenuse = [ab, bc, ca].sort(getLineLength)[0];
hypotenuse.setAttribute("stroke-width", 5);
function getLineLength(el) {
var x1 = el.getAttribute("x1");
var x2 = el.getAttribute("x2");
var y1 = el.getAttribute("y1");
var y2 = el.getAttribute("y2");
var xs = x2 - x1;
var ys = y2 - y1;
xs = xs * xs;
ys = ys * ys;
return Math.sqrt(xs + ys);
}
这不起作用,它似乎总是抓住第一个元素。它看起来也不是很直观。在Javascript中实现这一点的正确方法是什么?我知道如何在循环中完成,但我想知道是否有一些函数式习惯用法允许我实现这一点
jsiddle在这里:当您将函数传递给sort()时,该函数必须接受两个参数并返回比较结果(-1、0或1),或者如果比较数字,则只需减去两个参数: 让您的示例发挥作用的简单方法如下:
var hypotenuse = [ab, bc, ca].sort(function(lineOne, lineTwo) {
return getLineLength(lineTwo) - getLineLength(lineOne);
})[0];
然后是你已经拥有的其他东西。请注意,减法的顺序很重要,因为它是从最低到最高或从最高到最低排序之间的差异 将函数传递给sort()时,该函数必须接受两个参数并返回比较结果(-1、0或1),或者如果比较数字,则只需减去两个参数即可: 让您的示例发挥作用的简单方法如下:
var hypotenuse = [ab, bc, ca].sort(function(lineOne, lineTwo) {
return getLineLength(lineTwo) - getLineLength(lineOne);
})[0];
然后是你已经拥有的其他东西。请注意,减法的顺序很重要,因为它是从最低到最高或从最高到最低排序之间的差异 因为
array.sort(function)
中的function
需要两个参数,您应该返回一个
- 小于零(表示第一个优先于第二个)李>
- 零(表示两者相等)李>
- 大于零(表示第二个大于第一个)
注意,我从
getLineLength
函数中去掉了Math.sqrt
部分,因为如果比较就是这个函数的全部功能,那么不需要计算平方根,删除它可能会使它快一点。因为数组.sort(函数)中的函数
需要两个参数,您应该返回一个整数
- 小于零(表示第一个优先于第二个)李>
- 零(表示两者相等)李>
- 大于零(表示第二个大于第一个)
注意,我从
getLineLength
函数中去掉了Math.sqrt
部分,因为如果比较就是这个函数的全部功能,那么不需要计算平方根,删除它可能会使它更快一些。我不记得JavaScript语法,所以语法可能是错误的,但如果我正确理解您的问题,则不需要sort(),您应该能够:
var maxLength = 0;
var longestElement = -1;
for (var i = 0; i < array.length; i++) {
if( getLineLength(array[i]) > maxLength )
longestElement = i;
}
var maxLength=0;
var longeselement=-1;
对于(var i=0;imaxLength)
longeselement=i;
}
如果longeselement为-1,则没有长度大于0的行。否则,斜边是数组[LongesElement]
请注意,此示例和sort()示例均未对等长的行(例如等边三角形)进行任何特殊处理。我不记得JavaScript语法,因此语法可能错误,但如果我正确理解您的问题,则不需要sort(),您应该能够做到:
var maxLength = 0;
var longestElement = -1;
for (var i = 0; i < array.length; i++) {
if( getLineLength(array[i]) > maxLength )
longestElement = i;
}
var maxLength=0;
var longeselement=-1;
对于(var i=0;imaxLength)
longeselement=i;
}
如果longeselement为-1,则没有长度大于0的行。否则,斜边是数组[LongesElement]
请注意,此示例和sort()示例均未对等长线(例如等边三角形)进行任何特殊处理.请注意,如果希望多次调用此函数,则可能希望缓存
getLineLength
的结果,因为它每行将被多次调用。请注意,如果希望多次调用此函数,则可能希望缓存getLineLength
的结果,因为它每行将被多次调用。@Duopixel很高兴这样做帮助:)@Duopixel很高兴能帮上忙:)