Как использовать цикл do while для многократного добавления строки в массив? - PullRequest
0 голосов
/ 18 июня 2019

Я очень близко ... Я думаю.Пытаясь использовать цикл do while, чтобы нажать «Я люблю Битлз!»в массив (n) количество раз, включая 0 любого введенного числа.

Реализовать цикл do-while внутри функции, которая добавляет «Я люблю Битлз!»в пустой массив.

Затем цикл должен увеличивать число, переданное в качестве параметра.Условие цикла должно проверить, чтобы увидеть, что номер параметра меньше 15. Он должен содержать количество строк, представляющих разницу между входным числом и 15.

Возвращает массив со строками "Iлюблю Битлз! ".

Я попробовал то, чему научился на этом курсе.Любое объяснение будет высоко ценится!

function iLoveTheBeatles(n) {
  let newArray = [];
  let LoveBeatles = newArray.push("I love the Beatles!");

  do {
    LoveBeatles;
    return newArray;
  } while (n < 15);

  if (n > 15)
    newArray.push(LoveBeatles);

  return newArray;
}
1) Beatles Loops iLoveTheBeatles returns an 
array of 'I love the Beatles!' 8 times 
when passed the parameter 7 :

Error: Expected [ 'I love the Beatles!' ] 
to equal 
[ 'I love the Beatles!', 'I love the Beatles!', 
'I love the Beatles!', 'I love the Beatles!', 
'I love the Beatles!', 'I love the Beatles!', 
'I love the Beatles!', 'I love the Beatles!' ]

Ответы [ 4 ]

2 голосов
/ 18 июня 2019

Кажется, вы пытаетесь вставить строку n раз в массив и вернуть этот массив в результате вызова функции. цикл do-while не является хорошим решением для этого, потому что, если вы передадите 0 функции, она должна вернуть пустой массив, верно? но цикл do-while с повторением по крайней мере один раз, пока проверка «while» не будет выполнена. В этом его отличие от цикла while. Итак, попробуйте это вместо:

function iLoveTheBeatles(n) {
    let loveTheBeatlesNTimes = [];
    let target = Math.sqrt(Math.pow(n - 15, 2))

    if (target > 0) {
        do {
            loveTheBeatlesNTimes.push('I Love The Beatles')
        } while (--target > 0)
    }

    return loveTheBeatlesNTimes;
}

console.log(iLoveTheBeatles(10)) // should output 5 times
console.log('----------')
console.log(iLoveTheBeatles(17)) // should output 2 times
1 голос
/ 18 июня 2019

Просто сделайте LoveBeatles функцией.Вам также необходимо return из функции в конце - и увеличить n, чтобы избежать бесконечного цикла.

function iLoveTheBeatles(n) {
  let newArray = [];
  let LoveBeatles = () => newArray.push("I love the Beatles!");
  do {
    LoveBeatles();
    n++;
  } while (n < 15);
  if (n > 15) LoveBeatles();
  return newArray;
}

const res = iLoveTheBeatles(7);

console.log(res);
console.log(res.length);
.as-console-wrapper { max-height: 100% !important; top: auto; }
0 голосов
/ 18 июня 2019

Вы можете использовать reapet для умножения текста, затем split по специальному символу, т.е. ~ и, наконец, удалить последнее значение:

var text = "I love the Beatles!~".repeat(4).split('~');
text.pop(); // remove last empty value
console.log(text)
0 голосов
/ 18 июня 2019

Определяя ваш LoveBeatles так, как вы это сделали, вы уже помещаете строку "I love the Beatles" в новый массив.Я совершенно уверен, что вы не собирались делать это.

Если вы просто хотите вставить нужную строку n раз в массив, есть несколько вариантов.Наиболее естественным является цикл for:

function iLoveTheBeatles(n) {
  const newArray = [];
  // throw error for invalid n
  if (n < 0) {
    throw new Error("Input value n is negative");
  }
  for (let i = 0; i < n; i++) {
    newArray.push('I love the Beatles!');
  }
  return newArray;
}

Решение while для цикла может выглядеть следующим образом:

function iLoveTheBeatles(n) {
  const newArray = [];
  // throw error for invalid n
  if (n < 0) {
    throw new Error("Input value n is negative");
  }
  while (newArray.length < n) {
    newArray.push('I love the Beatles!');
  }
  return newArray;
}
...