Использование цикла while для обхода массива - PullRequest
0 голосов
/ 22 марта 2019

Я прохожу лабораторию bootcamp и сталкиваюсь с некоторыми проблемами в циклической лаборатории. В упражнении предлагается создать функцию, которая принимает один аргумент - массив фактов. Я должен использовать цикл while, чтобы перебрать массив фактов, добавить !!! в конец каждого факта и вернуть массив строк с восклицательными знаками.

const facts = [
  "He was the last Beatle to learn to drive",
  "He was never a vegetarian",
  "He was a choir boy and boy scout",
  "He hated the sound of his own voice"
];

function johnLennonFacts() {
  let i = 0;
  while (i <= facts.lenght) {
    i++;
    console.log(facts[i] + '!!!');
  }
  return facts
}

Ответы [ 4 ]

0 голосов
/ 22 марта 2019

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

1) Ваше назначение говорит, что ваша функция должна принять один аргумент, массив . Таким образом, вам нужно иметь аргумент (или параметр) в скобках определения вашей функции, а затем передавать свой входной массив в функцию, когда вы ее вызываете. Что-то вроде:

// function definition
function johnLennonFacts(arr) {
  // your code
}

// pass your "facts" array to the function when you call it
johnLennonFacts(facts);

2) Ваш текущий оператор while попытается записать последние 3 элемента вашего массива, потому что вы увеличиваете i перед тем, как записывать значение вашего массива, а 1 является индексом второй элемент в вашем массиве, поскольку массивы индексируются нулем (это означает, что первый элемент в вашем массиве имеет индекс 0). Тогда ваш цикл столкнется с проблемой, которую он не сможет обработать, когда i увеличен до 4, но в индексе 4 нет элемента facts. Другие ответы дают некоторое представление о том, как вы можете исправить свой цикл while.

3) Вам необходимо присвоить facts[i] + '!!!' индексу в массиве, который вы планируете вернуть из своей функции. JavaScript не знает, что вы хотите изменить facts[i] на основе этой строки, он просто видит, что вы комбинируете его с каким-то другим текстом, но никуда не помещаете. Другие ответы дают некоторое представление о том, как вы можете назначить новую объединенную строку индексу в массиве, который вы вернете из своей функции.

Просто для забавы, здесь есть альтернатива другим ответам, которые могут дать вам дополнительное представление о том, как работают функции, циклы и массивы.

const facts = [
  "He was the last Beatle to learn to drive",
  "He was never a vegetarian",
  "He was a choir boy and boy scout",
  "He hated the sound of his own voice"
];

const exclamation = (arr) => {
  let i = arr.length;
  while (i) {
    i--;
    arr[i] += '!!!';
  }
  return arr;
}

let loudfacts = exclamation(facts);
console.log(loudfacts);
/*
[
  "He was the last Beatle to learn to drive!!!",
  "He was never a vegetarian!!!",
  "He was a choir boy and boy scout!!!",
  "He hated the sound of his own voice!!!"
]
*/
  • const exclamation = (arr) => {...} - это еще один способ определения функции (которая называется функция стрелки )
  • начинается с присвоения i = arr.length, чтобы мы могли вернуться в обратном направлении через массив
  • уменьшает i с использованием i-- перед тем, как назначить новую строку любому индексу массива, потому что мы знаем, что самый высокий индекс массива будет на единицу меньше его длины, поскольку массивы индексируются нулем
  • назначает новое строковое значение каждому индексу массива, используя arr[i] += '!!!', что является кратким способом произнесения arr[i] = arr[i] + '!!!'
  • , поскольку ноль - это "ложное" значение, цикл while завершается после итерации, где i уменьшается до нуля
  • затем мы возвращаем модифицированное arr из функции
  • мы вызываем нашу функцию и передаем ей массив facts, присваивая возвращаемое значение переменной с помощью let loudfacts = exclamation(facts);
0 голосов
/ 22 марта 2019

Если вам не нужно использовать while петлю map, это делает это намного чище.

const facts = [
"He was the last Beatle to learn to drive",
"He was never a vegetarian",
"He was a choir boy and boy scout",
"He hated the sound of his own voice"
];

function append(arr) {
  newArr = arr.map(el => el + ' !!!');
  return newArr;
}

console.log(append(facts));
0 голосов
/ 22 марта 2019

Смотрите комментарии в коде:

const data = [
  "He was the last Beatle to learn to drive",
  "He was never a vegetarian",
  "He was a choir boy and boy scout",
  "He hated the sound of his own voice"
];

function johnLennonFacts(facts) {
//                       ^^^^^
// your function has to accept the argument here

  var data = facts.slice(); // make a copy of the passed array
  
  var i = 0;

  while (i < data.length) { // fix misspelled length

    data[i] += '!!!'; // use += to add the !!!
    
    i++; // increment after adding the !!!
  }

  return data
}

var result = johnLennonFacts(data); // call the function 
console.log(result);
0 голосов
/ 22 марта 2019

Вот чего вы хотите достичь:

const facts = [
  "He was the last Beatle to learn to drive",
  "He was never a vegetarian",
  "He was a choir boy and boy scout",
  "He hated the sound of his own voice"
];

// With one argument (array of facts) it's better :p
function johnLennonFacts(facts) {
  let i = 0;
  const factsModified = [];
  while (i <= facts.length) {
    factsModified.push(facts[i] + '!!');
    i++;
  }

  return factsModified;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...