为何用存储整数的变量访问数组元素时结果为undefined?
问题:数组下标使用变量时返回undefined?
我尝试编写了如下函数:
var uniqueInOrder = function(iterable){ const someArray = [] let count = 0 for (const i of iterable) { if (i != someArray[count]) { console.log(someArray[count]) someArray.push(i) count++ } else { continue } } return someArray } console.log(uniqueInOrder('AAAABBBCCDAABBB'))
问题描述:
当我使用someArray[1]时可以正常访问数组元素,但使用存储整数的变量count作为下标,即someArray[count]时,结果却为undefined。我是不是忽略了什么显而易见的问题?
提前感谢解答!
我曾编写单独的测试脚本:
const someArray = ['a', 2, 'c', 4] let count = 3 console.log(someArray[count])
该脚本运行正常。
我无法理解为何在上述函数场景中采用相同方式会出现undefined的情况。
解答
问题出在count变量的初始值和使用逻辑上:
- 初始时
someArray是空数组,count设为0,此时someArray[count]即someArray[0]自然是undefined。 - 每push一个元素后你就执行
count++,这导致count的值始终等于当前someArray的长度。而数组的下标范围是0到length-1,所以someArray[count]永远指向数组的下一个未定义的位置,而非最后一个已添加的元素。
比如第一次循环后,someArray是['A'],count变成1,此时someArray[1]就是undefined;第二次循环遇到的还是A,和undefined比较会判定为不等,错误地再次pushA,完全违背了去重逻辑。
你可以直接通过数组长度来获取最后一个元素,无需额外维护count变量,修正后的代码如下:
var uniqueInOrder = function(iterable){ const someArray = [] for (const i of iterable) { // 数组为空时直接添加,否则和最后一个元素比较 if (i !== someArray[someArray.length - 1]) { someArray.push(i) } } return someArray } console.log(uniqueInOrder('AAAABBBCCDAABBB')) // 输出 ["A","B","C","D","A","B"]
如果一定要用count变量,只需把初始值改为-1,这样第一次循环时someArray[count]是undefined,push后count变为0,后续就能正确指向数组最后一个元素:
var uniqueInOrder = function(iterable){ const someArray = [] let count = -1 for (const i of iterable) { if (i != someArray[count]) { someArray.push(i) count++ } } return someArray }
至于你的测试脚本能正常运行,是因为测试中count的值等于数组最后一个元素的下标(数组长度4,下标最大为3),而函数中count始终等于数组长度,两者逻辑完全不同。
内容的提问来源于stack exchange,提问作者imanidiot
相关产品推荐
相关产品推荐

