Моя функция возвращает неопределенный (JavaScript) - PullRequest
0 голосов
/ 02 мая 2018

Я тестирую функцию, она просто производит вычисления и проверяет, соответствует ли она критериям. Возвращается undefined и я не понимаю почему. Я поставил console.log(2) непосредственно перед return true, он записывает 2 на консоль, но не возвращает true. Я новичок в JavaScript, пожалуйста, помогите.

const cenas = [
  [1, 150, 3, 0, 0, 0, 2, 0],
  [2, 126, 1, 0, 2, 0, 3, 0],
  [3, 99, 1, 0, 0, 0, 2, 0],
  [4, 249, 1, 0, 0, 0, 2, 0]
];
let nC = 4;
let nA = 2;
let soma = 0;
for (let i = 0; i < nC; i++) {
  soma = soma + cenas[i][1];
}
let media = soma / nA;
let tolerancia = 0.5;
let nextStep = [1, 1, 2, 2];
let animador = 1;

const distribution = function(animador) {
  let indexes = [];
  let position = 0;
  let index = 0;
  for (let i = 0; index >= 0; i++) {
    index = nextStep.indexOf(animador, position);
    position = index + 1;
    if (index >= 0) {
      indexes.push(index);
    }
  }
  let soma = 0;
  for (i = 0; i < indexes.length; i++) {
    soma = soma + cenas[indexes[i]][1];
  }
  let criterio = Math.abs((soma - media) / media);
  if (criterio > tolerancia) {
    console.log(0)
    return false
  } else {
    console.log(1)
    if (animador >= nA) {
      console.log(2)
      return true
    } else {
      animador++;
      distribution(animador);
    }
  }
}

console.log(distribution(animador))

1 Ответ

0 голосов
/ 02 мая 2018

В JavaScript есть невидимая строка в конце каждой функции. Это return undefined; на тот случай, если вы забудете иметь return операторы во всех разных ветках вашего кода.

Если вы используете правильную среду IDE со стандартными настройками кодирования, такими как airbnb, она скажет вам, что distribution не работает, поскольку criterio > tolerancia === false и animador >= nA === false повторяются, но с результатом ничего не происходит. Это мертвый код.

Представьте, что вы сделали Math.abs((soma - media) / media); вместо let criterio = Math.abs((soma - media) / media);. Что хорошего это будет делать? Точно так же, как distribution(animador + 1); Вам нужно каким-то образом использовать результат, устанавливая его в переменную или возвращая его.

return distribution(animador + 1);

Вот ваш код после исправления некоторых замечаний, сделанных моим WebStorm с ESLint с включенной предустановкой airbnb:

const distribution = function (animador) {
    const indexes = [];
    let position = 0;
    let index = 0;
    for (let i = 0; index >= 0; i++) {
        index = nextStep.indexOf(animador, position);
        position = index + 1;
        if (index >= 0) {
            indexes.push(index);
        }
    }
    let soma = 0;
    for (let i = 0; i < indexes.length; i++) {
        soma += cenas[indexes[i]][1];
    }
    const criterio = Math.abs((soma - media) / media);
    if (criterio > tolerancia) {
        console.log(0);
        return false;
    }
    console.log(1);
    if (animador >= nA) {
        console.log(2);
        return true;
    }
    distribution(animador + 1);
    return undefined;
};

Я на самом деле не исправил ошибку, но теперь ее гораздо легче увидеть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...