Javascript 数组对象未定义

标签 javascript arrays object

我有以下功能:

function get_stoplight_color(count, position) {
    console.log(count + ', ' + position);

    var colors = {
        'QB' : ['#8b3a25', '#ceca63', '#68c24c', '#68c24c', '#68c24c'],
        'RB' : ['#8b3a25', '#ceca63', '#ceca63', '#ceca63', '#68c24c'],
        'WR' : ['#8b3a25', '#ceca63', '#ceca63', '#ceca63', '#ceca63'],
        'TE' : ['#8b3a25', '#ceca63', '#68c24c', '#68c24c', '#68c24c'],
        'DST' : ['#8b3a25', '#68c24c', '#68c24c', '#68c24c', '#68c24c'],
        'K' : ['#8b3a25', '#68c24c', '#68c24c', '#68c24c', '#68c24c']
    };

    console.log(colors);
    if (count <= 4) return colors.position[count];
    else return '#68c24c';
}

如您所见,我已将几个变量记录到控制台,它们在那里似乎很好。但是,在运行时我收到以下错误:

未捕获类型错误:无法读取未定义的属性“4”

(此时 count = 4。)

同样,对象 colors 显然存在,因为 console.log(colors) 输出:

Object {QB: Array[5], RB: Array[5], WR: Array[5], TE: Array[5], DST: Array[5]…}

因此,当 position = 'QB' 且 count< 时,我希望 colors.position[count] 返回 #68c24c/ = 4。

为什么在这种情况下对象仍然返回undefined?谢谢,如有必要,我将提供更多详细信息(我已经预先提供了我想到的所有内容)。

最佳答案

表达式colors.position[count]使用colors上的position属性。我认为您的意思是 colors[position][count],它将查找由变量 position 命名的属性(例如 QB)改为使用 colors,然后在结果中查找由 count 命名的属性(例如 4)。

如果有可能未定义position,我会在最后稍微更改一下该位。而不是:

if (count <= 4) return colors.position[count];
else return '#68c24c';

也许:

return (colors[position] && colors[position][count]) || '#68c24c';

...它利用了 JavaScript 的 curiously-powerful || and && operators .

<小时/>

在下面回复您的评论:

Wow, OK, that worked, but I'm not sure how? I didn't even try that since I view [] operands as indexes of an array, while colors is an object (not an array).

在 JavaScript 中(与许多语言不同),您可以通过两种方式访问​​对象属性:

  1. 使用点表示法和文字属性名称,例如obj.foo (前提是属性名称是有效的 identifier name ),或

  2. 使用括号表示法和字符串属性名称,例如obj["foo"](在这种情况下,属性名称可以是任何内容,不必是有效的标识符名称)。

在第二种情况下,字符串可以来自任何表达式,包括变量查找。所以所有这些都引用 obj.foo:

obj.foo
obj["foo"]
obj["f" + "o" + "o"]
var x = "o";
obj["f" + x + x]

...事实上,这与处理数组时使用的符号相同,因为在 JavaScript 中,arrays aren't really arrays ,它们只是对象。

关于Javascript 数组对象未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17915204/

相关文章:

JavaScript:将字符串数组转换为变量数组并将其作为参数传递给函数

c - 简单的 C 函数的奇怪行为

javascript - 在javascript中创建多维数组

javascript - VSCode 如果在省略大括号时缩进

php - Laravel toArray() 仍然返回 DB::raw 中的对象

javascript - 对象和 console.log 的奇怪行为

javascript - 访问对象的属性名称

c# - 如何设置接受稍后声明的对象的参数?

javascript - Starter "Hello World"React 项目给出空页面

javascript - 使用 AJAX 源和 appendTo 理解和实现 jQuery 自动完成