Функция, которая предназначена для возврата массива, возвращает undefined.Console.log (массив) внутри функции возвращает массив - PullRequest
3 голосов
/ 16 июня 2019

Я пытаюсь написать функцию, которая принимает массив и возвращает новый массив со всеми элементами, смещенными на n индексов влево. Например:

rotLeft([1,2,3,4],2)
// should return [3,4,1,2]

Я написал рекурсивную функцию, которая удаляет значение по индексу 0 и присваивает его последнему индексу, используя .shift () и .push ().

const rotLeft = (array, n) => {
  console.log(array, n); // <-- this prints out expected array
  if (!n) return array; // <-- but this returns undefined! :(
  array.push(array.shift());
  rotLeft(array, n - 1);
};
console.log(rotLeft([1, 2, 3, 4, 5, 6, 7], 9));

Почему каждый console.log (массив) выводит ожидаемый массив, но массив не определен, когда функция возвращает?

Ответы [ 4 ]

1 голос
/ 16 июня 2019

Вы не возвращаете повернутый массив (для каждого рекурсивного вызова), вам нужен еще один return для rotLeft(array, n - 1):

const rotLeft = (array, n) => {
  // console.log(array, n);
  if (!n) return array;
  array.push(array.shift());
  return rotLeft(array, n - 1); // <-- return the rotated array (recursively)
};
console.log(...rotLeft([1, 2, 3, 4, 5, 6, 7], 2));

Еще короче (с concat и троичным оператором):

const rotLeft = (array, n) => {
  return n ? rotLeft(array.concat([array.shift()]), n - 1) : array;
};
console.log(...rotLeft([1, 2, 3, 4, 5, 6, 7], 2));
0 голосов
/ 16 июня 2019

Или вы можете использовать Array.prototype.slice () для архивирования

const arr = [1,2,3,4]

const rotLeft = (arr, n) => arr.slice(n).concat(arr.slice(0,n))

const tmp1 = rotLeft(arr, 2)
const tmp2 = rotLeft(arr, 3)
console.log("tmp1", tmp1)
console.log("tmp2", tmp2)
0 голосов
/ 16 июня 2019

Вам необходимо return рекурсивный вызов.

const rotLeft = (array, n) => {
  if (!n) return array;
  array.push(array.shift());
  return rotLeft(array, n - 1);
};
console.log(rotLeft([1, 2, 3, 4, 5, 6, 7], 9));
0 голосов
/ 16 июня 2019

Попробуйте этот код ниже. Вы не возвращаете результаты из функции. Я только добавил оператор возврата

const rotLeft = (array, n) => {
  //console.log(array, n); // <-- this prints out expected array
  if (!n) return array; // <-- but this returns undefined! :(
  array.push(array.shift());
  return rotLeft(array, n - 1);
};

Использование: rotLeft ([1,2,3,4], 2)

выход enter image description here

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