Как вырезать первый элемент массива через Reduce?

Почему консоль лог возвращает ["Москва" ,"Смоленск"] Нужно из каждого массива удалить первый элемент и соединить их.

let list = [
  ['Иван', 'Москва', 'Питер', 'Нижний'],
  ['Петр', 'Можайск', 'Смоленск'],
  ['Саша', 'Москва', 'Смоленск']
];

let city = list.reduce((acc,val) => {
  val.shift();
  return val;
});

console.log(city);


Ответы (2 шт):

Автор решения: Roman

Нужно использовать map в данном случае.

И в данном случае лучше подойдет slice(1) чем shift, так как shift изменяет исходный массив

Для того чтобы преобразовать массив в "одномерный" можно воспользоваться методом flat()

let list = [
  ['Иван', 'Москва', 'Питер', 'Нижний'],
  ['Петр', 'Можайск', 'Смоленск'],
  ['Саша', 'Москва', 'Смоленск']
];

let city = list.map(val => val.slice(1)).flat(1)

console.log('city', city);
console.log('list', list);

Можете почитать как работает reduce:

Array.prototype.reduce()

Как работает reduce()

→ Ссылка
Автор решения: Grundy

Результатом метода .reduce, является значение, которое было возвращено на последней итерации.

В данном случае, это ['Саша', 'Москва', 'Смоленск'] без первого элемента, так как на каждой итерации, вместо аккумулятора возвращается значение текущего элемента

Вместо этого, необходимо было использовать acc, в котором содержится значение с предыдущей итерации.

Так как это массив - для объединения достаточно использовать метод .concat

let list = [
  ['Иван', 'Москва', 'Питер', 'Нижний'],
  ['Петр', 'Можайск', 'Смоленск'],
  ['Саша', 'Москва', 'Смоленск']
];

let city = list.reduce((acc, val) => {
  return acc.concat(val.slice(1));
}, []);

console.log(city);

Альтернативным решением может быть использование метода .flatMap

let list = [
  ['Иван', 'Москва', 'Питер', 'Нижний'],
  ['Петр', 'Можайск', 'Смоленск'],
  ['Саша', 'Москва', 'Смоленск']
];

let city = list.flatMap((val) => val.slice(1));

console.log(city);

→ Ссылка