вывод данных из функции

Рейтинг: 1Ответов: 2Опубликовано: 19.02.2023

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

Если возвращать с переменной без консоли выводится только последняя строка

`RuBrick (репутация: 13): Понял, спасибо!` 

Не совсем понимаю почему.

RuBrick (репутация: 3): Посоветуйте, пожалуйста, с одной стороны подробную, а с другой доступную для понимания книгу. Спасибо
RuBrick (репутация: 3): Неужели нет хорошей литературы?
Popov (репутация: 2310): Тебе нужна литература по  и дока на официальном сайте.
Void (репутация: 5005): В сети много сайтов с хорошими объяснениями + есть курсы.
noname (репутация: 100): Есть большая книга «Подробное руководство», потом смотришь документацию.
noname (репутация: 110): Или можно посмотреть видео-курсы на youtube! А самое главное - практика! И этот форум - лучшая тренировочная площадка!
RuBrick (репутация: 13): Понял, спасибо!

let thread = {
  title: "Поделитесь книжкой",
  messages: [{
      text: "Посоветуйте, пожалуйста, с одной стороны подробную, а с другой доступную для понимания книгу. Спасибо",
      author: {
        name: "RuBrick",
        reputation: 3,
        role: "user"
      }
    },
    {
      text: "Неужели нет хорошей литературы?",
      author: {
        name: "RuBrick",
        reputation: 3,
        role: "user"
      }
    },
    {
      text: "Тебе нужна литература  и дока на официальном сайте.",
      author: {
        name: "Popov",
        login: "popov_ma",
        reputation: 2310,
        role: "user"
      }
    },
    {
      text: "В сети много сайтов с хорошими объяснениями + есть курсы.",
      author: {
        name: "Void",
        login: "void",
        reputation: 5005,
        role: "user"
      }
    },
    {

      text: "Есть большая книга «Подробное руководство», потом смотришь документацию.",
      author: {
        name: "noname",
        login: "noname",
        reputation: 100,
        role: "user"
      }
    },
    {
      text: "Или можно посмотреть видео-курсы на youtube! А самое главное - практика! И этот форум - лучшая тренировочная площадка!",
      author: {
        name: "noname",
        login: "noname",
        reputation: 110,
        role: "user"
      }
    },
    {
      text: "Понял, спасибо!",
      author: {
        name: "RuBrick",
        login: "ru_brick",
        reputation: 13,
        role: "user"
      }
    },


  ]
};


const messageFromEachTopic = (object) => {

  let result = ``;
  for (let i = 0; i < object.messages.length; i++) {
    let chat = object.messages[i];
    result = `${chat.author.name} (репутация: ${chat.author.reputation}): ${chat.text}`;
    //console.log(`${chat.author.name} (репутация: ${chat.author.reputation}): ${chat.text}`);
  }
  return result;
}

let rez = messageFromEachTopic(thread);
console.log(rez)

Ответы

▲ 0

Используйте метод reduce, чтобы аккумулировать массив значений:

const messageFromEachTopic = (obj) =>
  obj.messages.reduce((acc, curr) => {
    acc.push(
      `${curr.author.name} (репутация: ${curr.author.reputation}): ${curr.text}`
    );

    return acc;
  }, []);

let rez = messageFromEachTopic(thread);
console.log(rez);
▲ 0

Если возвращать с переменной без консоли выводится только последняя строка(RuBrick (репутация: 13): Понял, спасибо!). Не совсем понимаю почему.

У тебя есть просто присваивание очередного значения. А нужно к существующему конкатенировать следующее.

Вот так

result += `${chat.author.name} (репутация: ${chat.author.reputation}): ${chat.text}`;

Но я предложу использовать метод map() - это преобразование твоего массива в новый массив. https://doka.guide/js/array-map/

let thread = {
  title: "Поделитесь книжкой",
  messages: [{
      text: "Посоветуйте, пожалуйста, с одной стороны подробную, а с другой доступную для понимания книгу. Спасибо",
      author: {
        name: "RuBrick",
        reputation: 3,
        role: "user"
      }
    },
    {
      text: "Неужели нет хорошей литературы?",
      author: {
        name: "RuBrick",
        reputation: 3,
        role: "user"
      }
    },
    {
      text: "Тебе нужна литература  и дока на официальном сайте.",
      author: {
        name: "Popov",
        login: "popov_ma",
        reputation: 2310,
        role: "user"
      }
    },
    {
      text: "В сети много сайтов с хорошими объяснениями + есть курсы.",
      author: {
        name: "Void",
        login: "void",
        reputation: 5005,
        role: "user"
      }
    },
    {

      text: "Есть большая книга «Подробное руководство», потом смотришь документацию.",
      author: {
        name: "noname",
        login: "noname",
        reputation: 100,
        role: "user"
      }
    },
    {
      text: "Или можно посмотреть видео-курсы на youtube! А самое главное - практика! И этот форум - лучшая тренировочная площадка!",
      author: {
        name: "noname",
        login: "noname",
        reputation: 110,
        role: "user"
      }
    },
    {
      text: "Понял, спасибо!",
      author: {
        name: "RuBrick",
        login: "ru_brick",
        reputation: 13,
        role: "user"
      }
    },


  ]
};


const messageFromEachTopic = (object) => {
  return object.messages.map(o => `${o.author.name} (репутация: ${o.author.reputation}): ${o.text}`).join('\n')
}

let rez = messageFromEachTopic(thread);
console.log(rez)