Не пойму фокус

Запускаю код

var inputFirst = `5 3
0 1
2 3
0 4`;

alert(journeyToTheMoon(parseInput(inputFirst)));

function journeyToTheMoon(data) {
  var n = data[0],
    p = data[1],
    pairs = data[2];
  //patriots are grooped to countries
  var patriots = [],
    internationalists = [],
    quantity,
    patriotsPairs = 0,
    internationalistsPairs = 0,
    mixPairs = 0,
    interTotal = 0,
    patrTotal = 0;

  for (let y = 0; y < n; y++) {
    internationalists.push(true);
  }
  interTotal = internationalists.length;

  if (pairs.length > 0) {
    patriots.push(pairs[0]);
    patrTotal += 2;
    internationalists[pairs[0][0]] = internationalists[pairs[0][1]] = false;
    interTotal -= 2;
  }

  for (let i = 0; i < pairs.length; i++) {
    let countryZero = whichCountryPatriot(pairs[i][0], patriots);
    let countryOne = whichCountryPatriot(pairs[i][1], patriots);

    if (countryZero !== null && countryOne === null) {
      patriots[countryZero].push(pairs[i][1]);
      patrTotal++;
      internationalists[pairs[i][1]] = false;
      interTotal--;
    } else if (countryZero === null && countryOne !== null) {
      patriots[countryOne].push(pairs[i][0]);
      patrTotal++;
      internationalists[pairs[i][0]] = false;
      interTotal--;
    } else if (countryZero === null && countryOne === null) {
      patriots.push([pairs[i][0], pairs[i][1]]);
      patrTotal += 2;
      internationalists[pairs[i][0]] = internationalists[pairs[i][1]] = false;
      interTotal -= 2;
    }
  }

  // count patriots pairs
  quantity = patrTotal;
  for (let p = 0; p < patriots.length; p++) {
    quantity -= patriots[p].length;

    for (let q = 0; q < patriots[p].length; q++) {
      patriotsPairs += 1 * quantity;
    }
  }

  // math theoreme
  if (interTotal !== 0) {
    internationalistsPairs = interTotal - 1;
  } else {
    internationalistsPairs = 0;
  }

  // count internationalists with patriots
  mixPairs = interTotal * patrTotal;

  return patriotsPairs + internationalistsPairs + mixPairs;
}

function parseInput(input) {
  if (typeof input !== "string") {
    input = input.toString();
  }

  var data = input.split("\n");
  data = data.map(item => {
    var line = item.split(" ");
    for (let si = 0; si < line.length; si++) {
      line[si] = +line[si];
    }

    return line;
  });

  console.log("parser", data[1][0], data[1][1], data[1][2]);
  console.log("parser", data[1]);
  let [n, p] = data.shift(data[0]);

  return [n, p, data];
}

function whichCountryPatriot(spaceman, patriots) {
  for (let j = 0; j < patriots.length; j++) {
    for (let k = 0; k < patriots[j].length; k++) {
      if (spaceman === patriots[j][k]) {
        return j;
      }
    }
  }

  return null;
}

и не понимаю, как туда четверка "вперлась"
111

Выделяю частную задачу

var inputFirst = `5 3
0 1
2 3
0 4`;

var data = parseInput(inputFirst);

function parseInput(input) {
  if (typeof input !== "string") {
    input = input.toString();
  }

  var data = input.split("\n");
  data = data.map(item => {
    var line = item.split(" ");
    for (let i = 0; i < line.length; i++) {
      line[i] = +line[i];
    }

    return line;
  });

  console.log("parser", data[1][0], data[1][1], data[1][2]);
  console.log("parser", data[1]);
  let [n, p] = data.shift(data[0]);

  return [n, p, data];
}

четверки нету

111

Вроде бы понял. Похоже, что это console.log() “вытворяет”. Где-то в “Современном учебнике” об этом писали. Может быть найду где…

Вывод в консоли Может быть это причина?

При «раскрытии» свойств объекта в консоли – браузер всегда выводит их текущие (на момент раскрытия) значения.

Именно в этом.

С этим знанием (из цитаты) не заморачивайся. Потому что это решение хрома в консоль выводить значение объекта на момент console.log, а при расскрытии - конкретное значение. Другие системы логирования могут себя вести иначе (например всегда показывать текущее значение объекта).

Главное в этой истории запомнить что объекты (массивы, функции т.е. все не примитивы) изменяются по ссылке. И они могут быть уже другими в тот момент когда доступаешься к ним второй, третий итд разы. И более главное - второй вывод - как можно чаще избегать модификации объектов по ссылке. Это может казаться удобным решением сиюминутной задачи, но с ростом сложности приложения эта механика отбирает легкость понимания кто и как изменили объект, следовательно увеличивает цену сложности внести изменения.

1 симпатия