- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的问题是关于使用 Javascript 对其边进行三 Angular 形评估。以下代码是非常初始的版本,即使它可以工作。我想知道它是否可以更简化,或者有其他方法可以达到相同的结果。
谢谢!
let a = Number(prompt('Please input the the first side (a)'))
let b = Number(prompt('Please input the the second side (b)'))
let c = Number(prompt('Please input the the third side (c)'))
if (a + b <= c || b + c <= a || c + a <= b || Number.isNaN(a) || Number.isNaN(b) || Number.isNaN(c) || a == "" || b == "" || c == ""){
console.log("invalid")
}
else if ((a > 0 && b >0 && c >0 ) && (a == b && b == c && c == a)){
console.log("equilateral triangle")
}
else if ((a > 0 && b >0 && c >0 ) && (a == b || b == c || c == a)){
console.log("isosceles triangle")
}
else {
console.log("scalene triangle")
}
最佳答案
另一种方法是将长度显式转换为数字(0 表示 NaN)并首先对它们进行排序。三元运算符在这里也很有用:
let [d, e, f] = [a, b, c].map(a => +a || 0).sort((a, b) => a-b);
let result = d + e <= f ? "invalid"
: d === f ? "equilateral"
: d < e && e < f ? "scalene"
: "isosceles";
console.log(result);
当执行数千次时,这不会是最快的,但我喜欢它的外观。
[a, b, c]
将三个值转换为 array .
.map
是一种可用于数组的方法。对于 [a, b, c]
中的每个原始值,执行以下(箭头)函数,
a => +a || 0
map
创建一个新数组,其中包含对每个单独值调用该函数的结果(因此首先使用 a
,然后使用 b
最后是 c
)
+a
使用 unary plus作为将值转换为数字的简便方法,这意味着您可以省略在代码的前三行中执行的 Number()
调用。当此结果为 NaN
或 0 时,则 || 0
将启动:而不是 NaN
或 0,将取而代之的是 0(||
是一个逻辑 OR 运算符,只有当左侧被认为是“假的”时才会使用 0 ”)。这实际上意味着 NaN
被替换为 0。
所以到现在为止代码大致做了类似下面的事情:
let newarray = [];
newarray[0] = +a;
if (Number.isNaN(newarray[0])) newarray[0] = 0;
newarray[1] = +b;
if (Number.isNaN(newarray[1])) newarray[1] = 0;
newarray[2] = +c;
if (Number.isNaN(newarray[2])) newarray[2] = 0;
然后在 .map()
返回的数组上调用另一个数组方法:方法 .sort()
.该方法将使用提供的回调函数 (a, b) => a-b
在数组中进行比较,并根据此类调用返回的值对其进行排序。由 sort
方法决定为哪些对调用此函数。当返回值为负数时,表示比较的值已经递增。当为正时,应重新排列它们。当为零时,它们应该被认为等于排序算法。
所以...我们现在有一个由保证不再有 NaN
且按升序排序的数字组成的数组。
然后使用所谓的destructuring分配该数组:
let [d, e, f] =
这意味着排序数组的各个值被一一分配给三个新变量。所以这大致是以下内容的缩写:
let d = new_sorted_array[0];
let e = new_sorted_array[1];
let f = new_sorted_array[2];
因为这些值现在是有序的,我们可以使用它们进行更简单的比较来决定三 Angular 形的形状。下面是一个使用 ternary operators 链的表达式这很像一个 if (...) ... else if ...
链。所以:
let result = d + e <= f ? "invalid"
: d === f ? "equilateral"
: d < e && e < f ? "scalene"
: "isosceles";
... 是这个的缩写:
let result;
if (d + e <= f) result ="invalid"
else if (d === f) result = "equilateral"
else if (d < e && e < f) result = "scalene"
else result = "isosceles";
关于javascript - 从边上评估三 Angular 形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59210551/
我是一名优秀的程序员,十分优秀!