【问题标题】:Two Dimensional JavaScript Array Issue With First Dimension Ignored忽略第一维的二维 JavaScript 数组问题
【发布时间】:2014-02-23 02:52:14
【问题描述】:

简而言之,我正在根据当前月份和日期填充一个数组。我不会复制代码来获取当前月份和日期,因为它工作正常。它适当地返回变量“月”和“日”。我的数组列表一年中的每一天都有一个项目。数组以 ...开头。

new var content = [[]];

那么数组就是这样列出来的……(略)

content[1,1]= "something for Jan 1";
content[1,2]= "something for Jan 2:;

问题是当我要求...

document.write(content[month,day]);

它忽略月份变量并转到该特定日期的最后一个可用日期变量。

我怀疑我正在尝试做一些不可能的事情,但我希望这只是一个小错误。感谢您的帮助。

【问题讨论】:

  • 改用content[1][2] = 'jan 1';。不知道你从哪里得到这个逗号符号,但它并不完全有效。

标签: javascript arrays multidimensional-array


【解决方案1】:

JavaScript 没有多维数组。此外,它的数组从 0 开始索引,而不是 1。并且您的第一条语句中的 new 不属于那里。

所以不要这样:

new var content = [[]];

content[1,1]= "something for Jan 1";
content[1,2]= "something for Jan 2";

你可以使用这个:

var content = [ [], [] ];

content[1][1] = "something for Jan 1";
content[1][2] = "something for Jan 2";

或者类似的东西。

您应该阅读 JavaScript 数组语法。听起来您正在尝试一些事情,但并不真正知道该语言中什么是有效的。像这样进行实验固然很好,但如果您知道什么样的实验可能会成功,那就更好了。

奇怪的是,即使这样的声明并没有达到你想要的效果:

array[ 1, 2 ] = 'foo';

有效的JavaScript。它有什么作用?嗯,JavaScript 有一个逗号运算符,它计算逗号两边的表达式并返回右边表达式的值。所以这个表达式:

1, 2

值为 2。换句话说,array[1,2] 忽略了1,实际上与array[2] 相同,即它返回数组的第三个元素。

您可以像这样在 JavaScript 控制台中进行测试:

var a = [ [10,20], [30,40] ];
console.log( a[1,1] );

这将打印:

[30, 40]

更新:

这是您在评论中链接到的代码的摘录:

var content = [ [], [] ];

content[1][1]= "placeholder.";
content[1][2]= "placeholder.";
// ...
content[1][30]= "placeholder.";
content[1][31]= "placeholder.";
content[2][1]= "placeholder.";
content[2][2]= "placeholder.";
// ...
content[2][30]= "placeholder.";
content[2][31]= "placeholder.";
content[3][1]= "placeholder.";
content[3][2]= "placeholder.";
// ...

让我们来谈谈这段代码的真正作用。首先,这一行:

var content = [ [], [] ];

这将创建一个包含两个元素的数组,其中每个元素本身都是一个空数组。由于 JavaScript 从 0 开始索引数组,因此这两个元素是 content[0]content[1]。没有content[2]content[3]等。那些都不存在。

然后你执行这个语句:

content[1][1]= "placeholder.";

现在content 包含:

[ [], [ null, "placeholder." ] ];

不是你想要的,是吗?

当你得到这个声明时:

content[2][1]= "placeholder.";

你会得到一个 JavaScript 错误:

TypeError: Cannot set property '1' of undefined

那是因为如上所述,content[2] 不存在。

看,正如我所说,您需要学习基本的 JavaScript 概念,例如数组如何工作的细节。有很多很好的教程和参考资料。

还可以学习如何使用 JavaScript 调试器,这样您就可以看到类似上面的错误,从而可以交互式地试验代码。

现在回到你想要做的事情。你想为一年中的每个月设置一个数组,每个月的每一天都有一些东西吗?要初始化数组,我只需使用一个数组字面量即可。

如果您不介意从零开始索引,请使用:

var content = [
    [
        "January First",
        "January Second",
        ...
    ],
    [
        "February First",
        "February Second",
        ...
    ],
    ...
];

那么content[0][0] 就是"January First"content[1][1] 就是"February Second",等等

如果您想对月份和日期使用从 1 开始的索引,您可以这样做:

var content = [
    null,
    [
        null,
        "January First",
        "January Second",
        ...
    ],
    [
        null,
        "February First",
        "February Second",
        ...
    ],
    ...
];

现在content[1][1]"January First"content[2][2]"February Second",等等。

【讨论】:

  • 谢谢迈克尔。但是,通过您的示例,我现在得到“未定义”的结果。
  • 哪个例子?以var a = ... 结尾的那个是正确的并且有效。如果您的代码不起作用,请将完整代码添加到您的问题中,我很乐意查看它。
  • 对不起,我在看到你添加的 cmets 之前发送了那个。我指的是第一个例子。 var 内容 = [ [], [] ]; content[1][1] = "1 月 1 日的东西"; content[1][2] = "1 月 2 日的东西";
  • 嗯,这只是一些示例代码,展示了如何访问数组数组。这不是一个完整的工作示例——那里没有产生任何输出的代码。发布不起作用的代码 - 完整的代码。
  • 如果你可以看一下,我已经将它上传到 [link]www.gensoup.org/work/content.js,而不是发布所有 300 多行。输出将来自调用文件中的简单 document.write 语句。
猜你喜欢
  • 2012-09-13
  • 1970-01-01
  • 2020-11-11
  • 1970-01-01
  • 1970-01-01
  • 2019-08-08
  • 2011-04-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多