Javascript - 使用变量作为数组索引

时间:2018-02-16 13:51:15

标签: javascript arrays

尝试将变量用作数组索引。变量addThirteen只需i并为其添加13。我需要将该结果用作数组索引。请看我的代码:

for (var i = 0; i < alphabetArr.length; i ++) {
  var addThirteen = (parseInt(i) + parseInt(13));
  var newCipher = new cipher(alphabetArr[i].letter, alphabetArr[addThirteen].letter);
}

这导致:

  

TypeError:undefined不是对象(评估   'alphabetArr [addThirteen] .letter')

感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

尝试打印迭代,每次都打开for循环:

console.log(i); console.log(addThirteen);

这里似乎发生的事情是,当我是alphabetArr.length-13时,它试图获得一个在数组之外的字符。因为它无法做到这一点,它会抛出错误,说这封信是未定义的,因为它是。这个问题的解决方案是:

for (var i = 0; i < alphabetArr.length - 13; i ++) {

答案 1 :(得分:0)

您获得的结果实际上取决于alphabetArr变量。

  • 以下是alphabetArr只是一个字符串数组的示例。

const alphabetArr = "abcdefghejklmnopqrstuvwxyz".split('');

/* If you want to see what alphabetArr really is, uncomment
 * the following line an run. (copy snippet to answer to do it)
 * The result will be ["a", "b", "c", ..., "z"].
 */
// console.log(alphabetArr);

/* we will always get undefined here because alphabet[i]
 * is not an object having the property letter.
 * Instead, it is just a string.
 */
for (var i = 0; i < alphabetArr.length; i++) {
  console.log(alphabetArr[i].letter);
}

此示例仅提供undefined,因为alphabetArr[i]不是属性letter的对象,而是字符串。

  • 现在我们将尝试查看如果alphabetArr是一个对象数组,每个对象都具有属性letter
  • 会发生什么

const alphabetArr = "abcdefghijklmnopqrstuvwxyz".split('')
  .map(letter => ({letter: letter}));
  
// console.log(alphabetArr);
// result: [ { letter: "a" } , ... , { letter: "z" } ]

/* Here everything works fine until we reach
 * the index 13, where the output is m z
 */
for (var i = 0; i < alphabetArr.length; i++) {
  // Note that I am not parsing. It's because it is not necessary.
  var addThirteen = i + 13;
  console.log(alphabetArr[i].letter, alphabetArr[addThirteen].letter);
}

如你所见,现在我们得到了一些东西,但在某个时刻,我们仍然会得到抛出的错误。这是因为for循环遍历整个数组。 因此,当i为14时,addThirteen将为27.但是数组的长度为26,因此alphabetArr[27]undefined

  • 现在我们已经理解了这个问题,让我们来解决它。

const alphabetArr = "abcdefghijklmnopqrstuvwxyz".split('')
  .map(letter => ({letter: letter}));

for (var i = 0; i < alphabetArr.length - 13; i++) {
  // let's skip the addThirteen variable declaration.
  console.log(alphabetArr[i].letter, alphabetArr[i + 13].letter);
}

是的!解决方案是循环遍历数组减去十三,以避免超出范围索引。

最终代码:

const alphabetArr = "abcdefghijklmnopqrstuvwxyz".split('')
  .map(letter => ({letter: letter}));

for (var i = 0; i < alphabetArr.length - 13; i++) {
  var newCipher = new cipher(alphabetArr[i].letter, alphabetArr[i + 13].letter);
}