2016-02-10 1 views
0

Я пытаюсь перевести все алфавиты в сообщении на p алфавитов в последовательности. например: Translate («bbcd», 2) вернет «ddef». Я застрял в части массива, где алфавиты [j + p] возвращаются undefined. Если я делаю алфавиты [j-p], он будет работать.return undefined при добавлении индекса массива

Вот мой код:

function Translate(Message, p) { 
var alphabets = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']; 
var message_array = Message.split(''); 
for(var i in message_array){ 
    for(var j in alphabets){ 
     if(message_array[i]==alphabets[j]){ 
      message_array[i]=alphabets[j+p];//returns undefined 
     } 
    } 
} 
return message_array; 
} 
console.log(Translate("bbcd", 2)); 
+0

что, если '' Message' имеет y' или 'z' в нем? – gurvinder372

ответ

1

alphabets[j+p]; возвращает неопределенное значение для j == 26, что он достигнет к итерации внутреннего цикла.

использование indexOf метод массива и изменить структуру цикла в

for(var i in message_array) 
{ 
    var index = alphabets.indexOf(message_array[ i ]); 
    message_array[ i ] = alphabets[ index + 2 ]; 
} 

Это также достигнет «неопределенными», если ваш Message имеет y или z в нем.

так, вы можете цикл его обратно к началу

for(var i in message_array) 
{ 
    var index = alphabets.indexOf(message_array[ i ]); 
    message_array[ i ] = alphabets[ (index + 2) % alphabets.length ]; 
} 
0

Вам нужно сломать, как только значение найдено. В противном случае внутренний цикл снова найдет совпадение в предстоящих циклах.

function Translate(Message, p) { 
 
    var alphabets = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']; 
 
    var message_array = Message.split(''); 
 
    for (var i in message_array) { 
 
    for (var j in alphabets) { 
 
     if (message_array[i] == alphabets[j]) { 
 
     console.log(alphabets[parseInt(j) + parseInt(p)]) 
 
     message_array[i] = alphabets[parseInt(j) + parseInt(p)]; //returns undefined 
 
     break; 
 
     } 
 
    } 
 
    } 
 
    return message_array; 
 
} 
 
alert(Translate("bbcd", 2));

2

Проблема заключается в том j+p, которая делает конкатенацию, typeof j возвратит string, как вы читаете индекс массива с помощью for...in

function Translate(message, p) { 
 
    var alphabets = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']; 
 

 
    return message.split('').map(function(c) { 
 
    var idx = alphabets.indexOf(c); 
 
    return idx == -1 ? c : alphabets[(idx + p) % alphabets.length] 
 
    }); 
 

 
} 
 

 
var value = Translate("azpq", 2); 
 
result.innerHTML = JSON.stringify(value);
<div id="result"></div>

0

Вам нужно убедиться, что j + p никогда не превышает длину алфавитов. Это приведет к ошибке «за пределами границ». например p = 30.

Исправление состоит в том, чтобы просто проверять длину по сравнению с p и возвращать то, что определено.

message_array[i] = (j+p > alphabets.length) ? alphabets[j+p] : alphabets[j]; // returns element at j if out of bounds 
1
function Translate(Message, p) { 
      var alphabets = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']; 
      var messageLength = Message.length; 
      var returnMessage = ''; 

      for(var i=0; i< messageLength; i++) { 
       var myChar = Message.charAt(i); 
       var placeChar = alphabets.indexOf(myChar); 

       myChar = alphabets[placeChar + p]; 

       returnMessage += myChar; 
      } 

      return returnMessage; 
     } 

     console.log(Translate("bbcd", 2)); 
0

Это предложение работает с алфавитной строки вместо массива.

Вы можете получить доступ к строке, подобной массиву, для одного символа. Для поиска я предлагаю использовать indexOf(), метод availabele на строковых объектах String#indexOf(), а также объекты массива Array#indexOf(). Оба метода возвращают позицию найденного элемента/строки/символа или -1, если не найдены.

Для результата я взял пустую строку и связал ее с новым персонажем.

Для правильного диапазона индекса при добавлении некоторого значения выбранным методом является использование modulo operator. Он возвращает напоминание о делении на второе число. Здесь это длина строки alphabet.

function translate(message, p) { 
 
    var alphabet = 'abcdefghijklmnopqrstuvwxyz', 
 
     i, pos, result = ''; 
 
    for (i = 0; i < message.length; i++) { 
 
     pos = alphabet.indexOf(message[i]); 
 
     result += alphabet[(pos + p) % alphabet.length]; 
 
    } 
 
    return result; 
 
} 
 

 
document.write(translate("bbcd", 2));

Смежные вопросы