添加数组索引时返回undefined

时间:2016-02-10 09:24:43

标签: javascript arrays

我正在尝试将邮件中的所有字母翻译成序列中的p字母。例如:翻译(" bbcd",2)将返回" ddef"。我被困在数组部分,其中字母[j + p]返回undefined。如果我做字母[j-p],它会起作用。

这是我的代码:

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));

6 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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 ];
}

这也将达到&#39; undefined&#39;如果您的Message中包含yz

所以,您可能希望将其循环回到开头

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

答案 2 :(得分:1)

SetDllDirectory

答案 3 :(得分: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));

答案 4 :(得分: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

答案 5 :(得分:0)

此建议适用于字母字符串而非数组。

您可以为单个字符访问类似数组的字符串。对于我建议使用// given List<ClassA> {{1,"a"},{2,"b"},{3,"c"},{4,"d"}} etc Lisst<ClassB> {{1,"aaa","ccc","aasdaf"},{3,"aaa","ccc","aasdaf"}} // expected result List<ClassA> {{1,"a"},{3,"c"}} 的查找,可以在字符串对象String#indexOf()以及数组对象Array#indexOf()中使用该方法。两种方法都返回找到的项目/字符串/字符的位置,如果找不到则返回indexOf()

结果我拿了一个空字符串并用新字符连接起来。

对于正确的索引范围,在添加一些值时,选择的方法是使用modulo operator。它返回第二个数字的除法提醒。这是-1字符串的长度。

alphabet