Как добиться результатов без повторения кода?

#javascript

#javascript

Вопрос:

Моя цель — задать вопрос, отформатированный точно так:

       What is your favourite programming language?
      0: JavaScript
      1: Python
      2: Rust
      3: C  
  

Я добился этого путем деструктурирования options массива внутри poll объекта внутри resisterNewAnswer() метода. Я использовал n , но выглядит ужасно, повторяя его. Я пытался использовать цикл for of, но не уверен, как его реализовать. Я пытаюсь добиться этого внутри resisterNewAnswer() метода.

 const poll = {
  question: 'What is your favorite programming language?',
  options: ['0: JavaScript', '1: Python', '2: Rust', '3:c  '],
  answers: new Array(4).fill(0),
  registerNewAnswer() {
    const [j, p, r, c] = this.options;
    prompt(
      `What is your favourite programming language? n ${j} n ${p} n ${r} n ${c}`
    );
  },
};
poll.registerNewAnswer();  

Комментарии:

1. this.options.join('n ') или что-то еще, чтобы получить единую строку со всеми частями, соединенными вместе

2. То, что у вас уже есть, довольно точно…

3. я, наконец, понимаю, чего вы хотите.. вы хотите НЕСКОЛЬКО результатов, верно? я помещаю ответ

Ответ №1:

Вы можете использовать любую из популярных библиотек шаблонов JavaScript: ejs, handlebars или mustache.

Вот пример использования mustache:

 const questionTemplate = `
{{question}}
{{#options}}
{{index}}: {{option}}
{{/options}}
`;

const poll = {
  question: 'What is your favorite programming language?',
  options: ['JavaScript', 'Python', 'Rust', 'C  '],
  answers: new Array(4).fill(0),
  registerNewAnswer() {
    prompt(Mustache.render(questionTemplate, {
      question: this.question,
      options: this.options.map((option, index) => ({option, index})),
    }));
  },
};
poll.registerNewAnswer();  
 <script src="https://unpkg.com/mustache@4/mustache.min.js"></script>  

За инициалом ` следует игнорировать первый символ новой строки.

Ответ №2:

Просто используйте join метод для достижения этого:

 const poll = {
  question: 'What is your favorite programming language?',
  options: ['0: JavaScript', '1: Python', '2: Rust', '3: C  '],
  answers: new Array(4).fill(0),
  registerNewAnswer() {
    const [j, p, r, c] = this.options;
    prompt(
      `What is your favourite programming language?n${this.options.join('n')}`
    );
  },
};
poll.registerNewAnswer();  

Ответ №3:

 const poll = {
  question: 'What is your favorite programming language?',
  options: ['0: JavaScript', '1: Python', '2: Rust', '3: c  '],
  answers: new Array(4).fill(0),
  registerNewAnswer() {
    const jprc=`n${this.options.join('n')}`
    const x=()=>prompt(`What is your favourite programming language? ${jprc}nOr -1 to end entries`) //x becomes a function that prompts you and returns what you input
    var i=x()
    while(i!=-1){this.answers[i%this.options.length]  ;i=x()} //the % logic to prevent incorrect entry(or you can have an if statement that just won't record it if incorrect index)
  },
};
poll.registerNewAnswer();
console.log(poll.answers)  

Ответ №4:

Одна вещь, которую я бы сделал, это использовать this.question в приглашении вместо его повторения. Кроме того, объединение опций с помощью join позволит вам упростить, имея возможность использовать разное количество опций.

 const poll = {
  question: '',
  options: [],
  answers: new Array(4).fill(0),
  registerNewAnswer() {
    return prompt(`${this.question}n${this.options.join("n")}`
    );
  },
};

poll.question = "What is your favorite programming language?";
poll.options = ['0: JavaScript', '1: Python', '2: Rust', '3:c  '];
console.log(poll.registerNewAnswer());

poll.question = "Question 2?";
poll.options = ['0: JavaScript', '1: Python', '2: Rust', '3:c  '];
console.log(poll.registerNewAnswer());