查找多边形的周长

时间:2019-03-18 14:56:43

标签: javascript arrays

问题的描述在代码顶部的注释中给出。 我得到的输出是NaN而不是perimeter的整数

/*
 * Implement a Polygon class with the following properties:
 * 1. A constructor that takes an array of integer side lengths.
 * 2. A 'perimeter' method that returns the sum of the Polygon's side lengths.
 */
class Polygon
{
    constructor(sides)
    {
        this.sides = sides;
    }

    perimeter()
    {
        var per = 0;
        for (var i = 0; i <= this.sides.length; i++)
        {
            per += this.sides[i];
        }
        return per;
    }
}

这段代码运行上面的代码:

const rectangle = new Polygon([10, 20, 10, 20]);
const square = new Polygon([10, 10, 10, 10]);
const pentagon = new Polygon([10, 20, 30, 40, 43]);

console.log(rectangle.perimeter());
console.log(square.perimeter());
console.log(pentagon.perimeter());

3 个答案:

答案 0 :(得分:0)

for循环的限制在数组末尾超过1。

for (var i = 0; i <= this.sides.length; i++)

大小为length的数组将以length - 1作为最后一个索引。要解决此问题,请使用:

for (var i = 0; i < this.sides.length; i++)

答案 1 :(得分:0)

<=更改为<,这样就不会越过sides数组的范围:

for (var i = 0; i <= this.sides.length; i++)

针对:

for (var i = 0; i < this.sides.length; i++)

您可以使用reduce来总结自己的观点:

class Polygon {
  constructor(sides) {
      this.sides = sides;
  }

  perimeter() {
    return this.sides.reduce((sum, side) => sum + side, 0);
  }
}

const rectangle = new Polygon([10, 20, 10, 20]);
const square = new Polygon([10, 10, 10, 10]);
const pentagon = new Polygon([10, 20, 30, 40, 43]);

console.log(rectangle.perimeter());
console.log(square.perimeter());
console.log(pentagon.perimeter());

答案 2 :(得分:0)

其他答案是正确的,问题是i会从数组末尾移出一个,这会给您带来麻烦。这是由于使用for循环迭代数组而引起的问题的说明。 i仅与您要迭代的数组相关,并且很容易在我们{em>认为在i和该数组与我们在代码中创建的数组不太相同。

因此,我建议使用类似reduce的名称。您可能还使用forEach并跟踪总和,但是reduce迄今为止是总和的最佳选择,因为它被设计为可迭代并产生单个值。

这是它的外观:

class Polygon
{
    constructor(sides)
    {
        this.sides = sides;
    }

    perimeter()
    {
      return this.sides.reduce((prev, curr) => prev + curr, 0);
    }
}

const rectangle = new Polygon([10, 20, 10, 20]);
const square = new Polygon([10, 10, 10, 10]);
const pentagon = new Polygon([10, 20, 30, 40, 43]);

console.log(rectangle.perimeter());
console.log(square.perimeter());
console.log(pentagon.perimeter());