Генерация HTML списка определений из массива

Задача: Реализуйте функцию buildDefinitionList(), которая генерирует HTML список определений (теги <dl>, <dt> и <dd>) и возвращает получившуюся строку. При отсутствии элементов в массиве функция возвращает пустую строку. Экспортируйте функцию по умолчанию. Список определений следующего формата:

const definitions = [
  ['definition1', 'description1'],
  ['definition2', 'description2']
];

Мой вариант не работает:

const buildDefinitionList = (definitions) => {
    if (definitions.length > 0) {
      const value = [];
      for (const item of definitions) {
        const definition = item[0];
        const description = item[1];
        value.push(`<dt>${definition}</dt><dd>${description}</dd>`);
      }
    const secondValue = value.join('');
    return result = `<dl>${secondValue}</dl>`;
    }
    if (definitions.length == 0) {
      return '';
    }
  }

export default buildDefinitionList();

Не подскажете - где копать?


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

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

Функция buildDefinitionList не должна вызываться сразу при экспорте.

 const buildDefinitionList = (definitions) => {
  if (definitions.length > 0) {
    const value = [];
    for (const item of definitions) {
      const definition = item[0];
      const description = item[1];
      value.push(`<dt>${definition}</dt><dd>${description}</dd>`);
    }
    const secondValue = value.join('');
    return `<dl>${secondValue}</dl>`;
  }

  // Если definitions.length == 0
  return '';
};

export default buildDefinitionList; //<- НЕ ФУНКЦИЯ
→ Ссылка
Автор решения: SwaD

У вас ошибка в строке

return result = `<dl>${secondValue}</dl>`;

Переменная result не объявлена(да и она тут не нужна)

Также, вы экспортируете результат работы функции

export default buildDefinitionList(); // () - вызывают функцию

Хотя должны экспортировать функцию, для этого вызывать ее не надо

export default buildDefinitionList;

Вот пример вашей функции, которая будет работать:

const buildDefinitionList = (definitions) => {
  if (definitions.length > 0) {
    const value = [];
    for (const item of definitions) {
      const definition = item[0];
      const description = item[1];
      value.push(`<dt>${definition}</dt><dd>${description}</dd>`);
    }
    const secondValue = value.join('');
    return  `<dl>${secondValue}</dl>`;
  }
  if (definitions.length === 0) {
    return '';
  }
}

Однако код избыточен и лучше воспользоваться встроенными методами массивов(тут лучше всего подходит reduce):

const buildDefinitionList2 = (definitions) => {
  if (definitions.length) {
    return `<dl>${definitions.reduce((acc, item) => {
      return `${acc}<dt>${item[0]}</dt><dd>${item[1]}</dd>`
    }, '')}</dl>`;
  }
  return '';
}

Рабочий пример

const definitions = [
  ['definition1', 'description1'],
  ['definition2', 'description2']
];

const buildDefinitionList2 = (definitions) => {
  if (definitions.length) {
    return `<dl>${definitions.reduce((acc, item) => `${acc}<dt>${item[0]}</dt><dd>${item[1]}</dd>`, '')}</dl>`;
  }
  return '';
}

console.log(buildDefinitionList2(definitions))

Ну и было бы не плохо, научиться смотреть ошибки в коде javascript.


P.S.: При желании, код можно уложить в одну строку
const buildDefinitionList3 = definitions => definitions.length ? `<dl>${definitions.reduce((acc, item) => `${acc}<dt>${item[0]}</dt><dd>${item[1]}</dd>`, '')}</dl>` : '';

Он не такой читабельный, однако... можно(на любителя)

→ Ссылка