Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 获取数组中最长的路径,函数式_Javascript_Svg_Functional Programming_Geometry - Fatal编程技术网

Javascript 获取数组中最长的路径,函数式

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")

我有一个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");
    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很高兴能帮上忙:)