Почему у меня метод возвращающий массив факториалов вместо чисел 'undefined'?
Всем доброго вечера. Мне нужно сделать следующее задание: Создать абстрактный класс “AClass” у которого будет свойство “Numbers” типа Array, который будет содержать n натуральных чисел. Также AClass должен иметь метод “fill”, который заполняет массив Numbers случайными числами; метод “factorial”, который возвращает массив факториалов из массива Numbers. Я написал следующий код, метод fill выводит вместо чисел undefined.Помогите,пожалуйста, разобраться.
/**
* Abstract Class Aclass.
*
* @class Aclass
*/
class Aclass {
constructor(numbers) {
if (this.constructor == Aclass) {
throw new Error("Abstract classes can't be instantiated.");
}
this.numbers = numbers;
}
fill() {
return this.numbers.from({length: 40}, () => Math.floor(Math.random() * 40));
}
factorial() {
var facArray = [];
for (var j = 0; j < this.fill().length; j++) {
let num = this.fill[j];
if (num === 0 || num === 1)
return 1;
for (var i = num - 1; i >= 1; i--) {
num *= i;
}
facArray.push(num);
}
console.log(facArray);
}
sort() {
throw new Error("Method 'sort()' must be implemented.");
}
}
class Class1 extends Aclass{
sort() {
console.log('sort');
}
}
class Class2 extends Aclass{
sort() {
console.log('sort');
}
}
const a =new Class1(Array);
//console.log(a);
a.fill();
a.factorial();
Ответы (1 шт):
Вот здесь for (var j = 0; j < this.fill().length; j++) { let num = this.fill[j];...
Ты на каждой итерации вызываешь this.fill() потом пытаешься взять this.fill[j] чего в природе не существует. Даже если ты вызовешь this.fill()[j] то каждый раз у тебя будет браться число из нового массива this.fill() по текущему индексу.. Пример с переделанным factorial()
метод fill выводит вместо чисел undefined
Ну а метод fill у тебя работает нормально
/**
* Abstract Class Aclass.
*
* @class Aclass
*/
class Aclass {
constructor(numbers) {
if (this.constructor == Aclass) {
throw new Error("Abstract classes can't be instantiated.");
}
this.numbers = numbers;
}
fill() {
return this.numbers.from({length: 40}, () => Math.floor(Math.random() * 40));
}
factorial() {
var facArray = [], fil = this.fill();
function fctrl(num) {
if (num == 0 || num == 1) {
return 1;
}
return num * fctrl(num - 1);
}
function getF(arr) {
var result = arr.map(x => fctrl(x));
return result;
}
return getF(fil)
}
sort() {
throw new Error("Method 'sort()' must be implemented.");
}
}
class Class1 extends Aclass{
sort() {
console.log('sort');
}
}
class Class2 extends Aclass{
sort() {
console.log('sort');
}
}
const a =new Class1(Array);
//console.log(a);
console.log(a.factorial());
//console.log(a.fill());
Здесь я добавлю имитацию того что происходит в цикле for но длина массива будет изменятся случайно на каждой итерации это просто для примера и ясности того, как отрабатывает for ..
function rand(min, max) {
let rand = min - 0.5 + Math.random() * (max - min + 1);
return Math.round(rand);
}
function Create() {
x = [];
for (var i = 0; i < rand(0,10); i++) {
var j = Math.floor( Math.random() * 101);
x[i] = j;
}
return x
}
let n = Create();
for (var i = 0; i < Create().length; i++) {
console.log(Create[i],Create()[i]);
}
console.log(n)