For语句在上次分配时返回意外值

时间:2016-08-30 17:09:01

标签: javascript

我正在尝试构建一个简单的“密码”来为字符串中的字母分配反转字母的值(例如a = zb = y等)。我构建了一个for语句,它似乎一直工作到最后一次调用而不是给出反转值而不是给出原始值。

我在for语句中注释掉了每一行,然后一次一个地检查它们以检查它们的返回。倒数第二个语句(c = rev.indexOf(c);)给出值25,24,23(如预期的那样),所以我不明白为什么当它在“字母”矩阵中查找时它会给出一个返回a,b,c而不是z,y,x。

var letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'y', 'x', 'z'];
var rev = letters.reverse();

var stringy = function(n){
    ns = n.split("");
    for (i = 0; i < n.length; i++){
            c = ns[i];
            c = rev.indexOf(c);
            c = letters[c];
            console.log(c);
    }
}

stringy("abc");

2 个答案:

答案 0 :(得分:4)

letters.reverse()不只是返回反向数组。它将阵列反转到位。

如果您在letters之后检查letters.reverse()的内容,您会看到订单已被撤消。

您可以使用.slice()复制数组,然后可以反转:

var rev = letters.slice().reverse();

答案 1 :(得分:1)

作为Array.reverse()方法的zzzzBov信息的补充,我想我会添加一个不需要翻转你的信件的答案。没有必要保留2个变量只是为了根据索引来反转它们,只需找到letters数组中的索引并从letters数组的末尾进行搜索。

我添加了一个稍微修改过的代码版本,以展示如何让自己变得更容易,并在我认为合适的地方添加了一些代码注释

&#13;
&#13;
// make your debugging easier
'use strict';

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

var getReversedCypher = function( text, sequence, unmatched ) {
  if (!text) {
    return '';
  }
  var ns = text.split(''),
      cypher = [], 
      lastLetterIndex = sequence.length - 1;
  
  // use strict adds forEach on arrays
  ns.forEach(function(char) {
    var index = sequence.indexOf(char);
    if (index < 0) {
      // couldn't find a match, you could throw an error, I chose to add an extra character
      cypher.push( unmatched || '-' );
    } else {
      // no need to use a reversed lookup, just search the table from the end
      cypher.push( sequence[lastLetterIndex-index] );
    }
  });
  return cypher.join('');
};

// make some utility methods to still use your simple function
var encode = function( text ) {
  return getReversedCypher( text, letters, '-' );
};

var decode = function( text ) {
  return getReversedCypher( text, [].concat(letters).reverse(), ' ' );
};
    
var encoded = encode("this is the sound of speech"), decoded = decode(encoded);

console.log('cypher: ' + encoded);
console.log('decoded: ' + decoded);
&#13;
&#13;
&#13;