Как передать переменную dymamic внутри метода в JavaScript? - PullRequest
0 голосов
/ 27 декабря 2018

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

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

Пока я знаю, что цикл работает просто отличноно я не получаю значений от phrase.slice(i,1), но если я заменю i действительным числом, это сработает.

Я думаю, что у меня здесь концептуальная проблема, и динамические переменные не могут быть назначены методам.Я знаю, что это может быть достигнуто с помощью других методов, но я хотел бы знать, почему это терпит неудачу, когда это имеет смысл для меня.

function reverseWords(phrase) {

  var build_reverse_word;

  for (let i = phrase.length ; i > 0 ; i--) {

    console.log(i); //This is just to verify that my loop is working

    build_reverse_word = phrase.slice(i,1);

    build_reverse_word = build_reverse_word + build_reverse_word;
  }

  return build_reverse_word;
}

let reverse_word_result = reverseWords("Dogs are Great Animals");

console.log(reverse_word_result);

То, чего я пытаюсь добиться, - это перевернуть строку назад.Спасибо за вашу поддержку.

Ответы [ 3 ]

0 голосов
/ 27 декабря 2018

Ваша проблема в том, что вы используете метод slice().Метод среза определяется как list.slice(startIndex,endIndex).Так как ваш код делает так, что endIndex всегда равен 1, JS пытается найти слово, которое начинается с большого числа, скажем 21, до низкого числа 1, которое никогда не будет работать.Все фрагменты должны иметь endIndex> startIndex.Таким образом, ваш код должен выглядеть следующим образом.

function reverseWords(phrase) {

     var build_reverse_word;

     for (let i = phrase.length ; i > 0 ; i--) {

        console.log(i); //This is just to verify that my loop is working

        build_reverse_word = phrase.slice(i-1,i);
        console.log(build_reverse_word)
        build_reverse_word = build_reverse_word + build_reverse_word;
     }
return build_reverse_word;
}

let reverse_word_result = reverseWords("Dogs are Great Animals");

console.log(reverse_word_result);   

сейчас ... есть некоторые другие проблемы с вашим кодом, но, так как вы новичок в JS, я думаю, было бы лучше, чтобы вы выяснили это на своемсвоя!

0 голосов
/ 27 декабря 2018

Сушант дал вам решение вашей проблемы!Но так как вы также изучаете язык, я хотел бы дать вам несколько принципов работы со строками:

Строка является экземпляром родительского объекта String и одного из шести примитивов * 1005.*.К символам в строках можно получить доступ с помощью скобочной нотации [] или с помощью метода charAt.

Это означает, что charAt или нотация с квадратными скобками тоже бы сработала и, вероятно, была бы менее запутанной, чем использованиеslice.

const stringValue = "Dogs are Great Animals"; //make it a constant (it will not change)

//a string is a instance of the super String, which has methods to it like slice and toUppercase.

console.log(stringValue[1]); //get the letter at position 1 - remember JavaScript is zero based.

//use a countdown (more memory efficient and less complicated
let reversed = "";
for (let i = stringValue.length-1; i >= 0; i--)
{
  reversed += stringValue[i];//use the += as a shorthand for reversed = reversed + ...
}
console.log(reversed);

Вы также можете преобразовать строку в массив с помощью split и оптимизировать свой код (без использования цикла)

const stringValue = "Dogs are great animals";
let reversed = "";

//We can use the split method to turn the string into an array
reversed = stringValue.split("");
reversed = reversed.reverse(); // now the array can be reversed
console.log(reversed.join("")); //we use join to glue the string back together.

Конечно, их можно комбинировать:И поместите в него некоторое обнаружение ошибок.

function reverseWords(phrase) {
  //test if phrase is string
  if (Object.prototype.toString.call(phrase) === "[object String]") {
    return phrase.split("").reverse().join("");
  }
  else
  {
    return "Error: object is not a string"; //return error
  }
}

let reverse_word_result = reverseWords("Dogs are Great Animals");

console.log(reverse_word_result);
0 голосов
/ 27 декабря 2018

Метод .slice принимает 2 аргумента.begin и end.Вы хотите извлечь только одну букву за каждую итерацию.Но в вашем случае переданные аргументы не являются правильными.

function reverseWords(phrase) {

  let build_reverse_word = '';

  for (let i = phrase.length; i > 0; i--) {

    let extracted_letter = phrase.slice(i - 1, i);

    build_reverse_word = build_reverse_word + extracted_letter;
  }
  return build_reverse_word;
}

let reverse_word_result = reverseWords("Dogs are Great Animals");

console.log(reverse_word_result);

Еще один способ обойти это, избегая цикла, - это использовать комбинацию методов split и reverse.

function reverseWords(phrase) {

  // split into array
  let phraseArray = phrase.split('');
  // reverse the array contents
  phraseArray.reverse();
  // return by joining the array
  return phraseArray.join('');
}

let reverse_word_result = reverseWords("Dogs are Great Animals");

console.log(reverse_word_result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...