评估三角形的一侧



我的问题是关于使用Javascript在其两侧进行三角形求值。以下代码是非常初始版本,即使它可以工作。我想知道它是否可以更简化,或者还有其他方法可以达到相同的结果。

谢谢!

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

另一种方法是将长度显式转换为数字(NaN 为 0(并首先对它们进行排序。三元运算符在这里也很有用:

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]将三个值转换为一个数组。

.map是一种可用于数组的方法。对于[a, b, c]中的每个原始值,将执行以下(箭头(函数,

a => +a || 0

map创建一个新数组,该数组由在每个单独的值上调用该函数的结果组成(因此首先使用a,然后使用b,最后使用c(

+a使用一元加号作为将值转换为数字的简短方法,这意味着您可以省略在代码的前三行中执行的Number()调用。当结果为NaN或 0 时,|| 0将启动:代替NaN或 0,取而代之的是 0(||是一个逻辑 OR 运算符,0 仅在左侧被认为是"falsy"时使用(。这实际上意味着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的数字组成,并且按升序排序。

然后使用所谓的解构分配该数组:

let [d, e, f] =

这意味着排序数组的各个值被逐个分配给三个新变量。所以这大致是:

let d = new_sorted_array[0];
let e = new_sorted_array[1];
let f = new_sorted_array[2];

因为这些值现在是有序的,所以我们可以使用它们进行更简单的比较,以确定三角形的形状。接下来是使用三元运算符链的表达式,它非常类似于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";

您可以减少大量体积并更改实现:

  1. 您可以让用户输入函数调用
  2. 您可以将输入放入数组中
  3. 您可以使用every来确保每个值都大于 0
  4. 您可以使用新的 Set 删除重复项,如果大小为 1
  5. ,则所有边都相同,如果是 2,则 2 边相同,如果是 3,则所有边都不同

const getSide = l => Number(prompt(`Please input the the second side (${l})`))
const sides = [getSide('a'), getSide('b'), getSide('c')]
if (sides.every(el => el > 0)) {
const size = new Set(sides).size
if (size === 1) console.log("equilateral triangle")
else if (size === 2) console.log("isosceles triangle")
else console.log("scalene triangle")
} else {
console.log("invalid")
}

测试用例:

const test = sides => {
if (sides.every(el => el > 0)) {
const size = new Set(sides).size
if (size === 1) console.log("equilateral triangle")
else if (size === 2) console.log("isosceles triangle")
else console.log("scalene triangle")
} else {
console.log("invalid")
}
}
test([0,1,2]) // invalid
test([NaN,NaN,NaN]) // invalid
test(['',1,2]) // invalid
test([3,3,3]) // eq
test([2,2,3]) // iso
test([1,2,3]) // sca

相关内容

  • 没有找到相关文章

最新更新