Не понятно поведения метода Array.map() в class

всем...

Есть такой class у меня.

Не могу сообразить с чего вдруг в методе getName данного класса странно ведет себя метод Array.map()

Чтобы увидеть данную проблему, раскомментируйте нижнюю строку и закомментируйте верхнюю.

Разница в них, только в {} фигурных скобках.

А вот в getData() такой проблемы не наблюдается...

//const arrayHtml = fs.readdirSync(path.resolve(__dirname, templateDir));

const arrayHtml = ['index.html', 'dash.html', 'zoo.html'];
class DataSiteConfig {
  constructor(folder, favicon) {
    this.name = name;
    this.favicon = favicon;
    this.folder = folder;
    this.pageList = [];
  }
  getName(dirNameFiles) {
    this.name = dirNameFiles.map((s, i, arr) => s.slice(0, -5));
  //this.name = dirNameFiles.map((s, i, arr) => {s.slice(0, -5)});
  }

  getData() {
    this.name.map((s, i, arr) => {
      this.pageList.push({
        title: s,
        template: `frontend/html/${s}.html`,
        filename: `pages/${s}.html`

      })
    })
  }
}

let dataSiteConfig = new DataSiteConfig('Zona', 'Chtoto.png');
dataSiteConfig.getName(arrayHtml);
dataSiteConfig.getData();
console.log("TCL: dataSiteConfig", dataSiteConfig);

Кто подскажут, почему так...


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

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

Вы немного ошиблись с синтаксисом. Тело стрелочной функции может иметь краткую (concise body) или блочную (block body) форму. Этот вариант:

this.name = dirNameFiles.map((s, i, arr) => s.slice(0, -5));

работает, потому что в стрелочных функциях мы можем не писать скобки, если нужно вернуть что-то, что пишется в одну строку. Это аналогично записи:

this.name = dirNameFiles.map((s, i, arr) => {
  return s.slice(0, -5);
});

Если написать скобки и не указать return, то возвращаться будет undefined, в полной форме записи это выглядит примерно так:

this.name = dirNameFiles.map((s, i, arr) => {
  s.slice(0, -5);
});

из-за этого каждый элемент массива будет undefined.

Код в getData() работает исправно, потому что там ничего не возвращается, а просто проходится цикл. Там вообще нет особого смысла использовать map(), потому что map() возвращает измененный массив, а в getData() идет обычный проход по всему массиву.

Документация MDN: Стрелочные функции

→ Ссылка