Ошибка в JSON. Не могу понять

Помогите, разобраться в чем проблема. Через консоль проверяю все верно срабатывает. Выводятся значения. А, через JSON идет непонятный повтор и значения не в строке как в примере. Иза чего это может быть?

/**
 * Класс для работы с API
 *
 * @author      User Name
 * @version     v.1.0 (dd/mm/yyyy)
 */
class Api {
  constructor() {}

  /**
   * Заполняет строковый шаблон template данными из объекта object
   *
   * @author      User Name
   * @version     v.1.0 (dd/mm/yyyy)
   * @param       {object} object
   * @param       {string} template
   * @return      {string}
   */
  get_api_path(object, template) {
    let result = '';

    api_path_templates.forEach((item) => {
      result += item.replace(/%(\w+)%/g, (_, str) => {
        if (object[str]) {
          return encodeURIComponent(object[str]);
        } else {
          return str;
        }
      });
    });
    
    console.log(result);

    return result;
  }
}

let user = {
  id: 20,
  name: 'John Dow',
  role: 'QA',
  salary: 100,
};

let api_path_templates = [
  '/api/items/%id%/%name%',
  '/api/items/%id%/%role%',
  '/api/items/%id%/%salary%',
];

let api = new Api();

let api_paths = api_path_templates.map((api_path_template) => {
  return api.get_api_path(user, api_path_template);
});

console.log(JSON.stringify(api_paths));

// Ожидаемый результат
let expected_result = [
  '/api/items/20/John%20Dow',
  '/api/items/20/QA',
  '/api/items/20/100',
];

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

Автор решения: Oliver Patterson

Вы передавали вторым параметром строку, но ее даже не использовали. Зато перебирали глобальную переменную, что не нужно делать. У @vsemozhebuty хороший ответ. Но данный лишь исправляет ваш.

/**
 * Класс для работы с API
 *
 * @author      User Name
 * @version     v.1.0 (dd/mm/yyyy)
 */
class Api {
  constructor() {}

  /**
   * Заполняет строковый шаблон template данными из объекта object
   *
   * @author      User Name
   * @version     v.1.0 (dd/mm/yyyy)
   * @param       {object} object
   * @param       {string} template
   * @return      {string}
   */
  get_api_path(object, template) {
    const result = template.replace(/%(\w+)%/g, (_, str) => {
      if (object[str]) {
        return encodeURIComponent(object[str]);
      } else {
        return str;
      }
    });

    return result;
  }
}

let user = {
  id: 20,
  name: 'John Dow',
  role: 'QA',
  salary: 100,
};

let api_path_templates = [
  '/api/items/%id%/%name%',
  '/api/items/%id%/%role%',
  '/api/items/%id%/%salary%',
];

let api = new Api();

let api_paths = api_path_templates.map((api_path_template) => {
  return api.get_api_path(user, api_path_template);
});

console.log(JSON.stringify(api_paths, null, 2));

// Ожидаемый результат
let expected_result = [
  '/api/items/20/John%20Dow',
  '/api/items/20/QA',
  '/api/items/20/100',
];

→ Ссылка