gpt4 book ai didi

javascript - 在javascript中循环实例化类使用最后一个值

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:18:53 25 4
gpt4 key购买 nike

首先,我知道有很多关于 JavaScript 中的闭包的问题,​​尤其是涉及到循环时。我已经阅读了其中的许多内容,但我似乎无法弄清楚如何解决我自己的特定问题。我的主要经验在于 C#、C++ 和一些 ASM,并且需要一些时间来适应 JavaScript。

我正在尝试在某些 for 循环中使用类(称为 Tile)的新实例填充 3 维数组。我想要做的就是传递对在第一个循环中实例化(并添加到另一个数组)中的某个其他类(称为组)的引用。您可能已经猜到,在循环完成后,Tile 类的每个实例都引用同一个 Group 对象,即最后一个要创建的对象。

显然,不是传递对 Group 对象的引用,而是传递对函数局部变量的引用,该引用在循环的每次迭代中更新。我的假设是解决这个问题与闭包有关,因为这似乎是我在寻找解决方案时遇到的许多类似问题的情况。

我在 jsFiddle 上发布了一些暴露问题核心的精简代码:

//GW2 namespace
(function( GW2, $, undefined ) {

//GW2Tile class
GW2.Tile = function(globalSettings, kineticGroup)
{
//Private vars
var tilegroup = kineticGroup;
// console.log(tilegroup.grrr); //Shows the correct value
var settings = globalSettings;

this.Test = function(){
console.log(tilegroup.grrr);
}

this.Test2 = function(group){
console.log(group.grrr);
}

} //Class

}( window.GW2 = window.GW2 || {}, jQuery ));


var zoomGroups = [];
var tiles = [];
var settings = {};

InitArrays();
tiles[0,0,0].Test(); //What I want to work, should give 0
tiles[0,0,0].Test2(zoomGroups[0]); //How I'd work around the issue

function InitArrays(){
var i, j, k, zoomMultiplier, tile;

for(i = 0; i <= 2; i++){
zoomGroups[i] = {};
zoomGroups[i].grrr = i;

tiles[i] = [];
zoomMultiplier = Math.pow(2, i);
for(j = 0; j < zoomMultiplier; j++){
tiles[i,j] = [];
for(k = 0; k < zoomMultiplier; k++){
tile = new GW2.Tile(settings, zoomGroups[i]);
tiles[i,j,k] = tile;
}
}
}
}

到目前为止,在使用 JavaScript 时,我通常会稍微修改代码以使其正常工作,但我厌倦了使用看起来很乱的变通方法,因为我知道实际上应该有一些相当简单的解决方案.我只是不喜欢寻求帮助,但这确实让我费尽心思。非常感谢任何帮助。

最佳答案

多维数组

问题

上面代码的第一个问题是您如何尝试创建多维数组。

您使用的语法是:

tiles[0,0,0]

但是,JavaScript 解释它的方式是:

tiles[0]

访问多维数组

如果你想访问一个 multidim 数组,你必须使用:

tiles[0][0][0]

要创建多维数组,您需要执行以下操作:

tiles = [];
tiles[0] = [];
tiles[0][0] = [];
tiles[0][0][0] = 'value';

或:

tiles = [[['value']]];


关于您的代码

在你的代码中你应该使用:

tiles[i][j][k] = tile;

但是你也应该确保每个子数组在设置它的值之前确实存在,否则你会得到 undefinedillegal offset 错误。

您可以通过以下方式做到这一点:

(typeof tiles[i] === 'undefined') && (tiles[i] = []);
(typeof tiles[i][j] === 'undefined') && (tiles[i][j] = []);
tiles[i][j][k] = tile;

显然,上面的内容可以根据您遍历循环的方式进行优化,即最好在进入 之前确保 tiles[i] 级别作为数组存在>[j] 循环,然后在执行 j 时不必担心再次检查它是否存在。


其他选项

根据您的数据集是什么,或者至少您希望使用 tiles 数组做什么,值得考虑使用对象来代替:

/// set up
tiles = {};

/// assignment
tiles[i+','+j+','+k] = 'value';

然而,尽管我的假设和不同的 JavaScript 解释器多次证明我是错误的,但这种方法可能会更慢。这可能是 jsPerf会是你的 friend 。


优化

使用 tiles[i][j][k] 方法的一个好处是它让您有机会优化您的引用。例如,如果您要在多维数组的一个级别上处理多个操作,您应该这样做:

/// set up
var ij = tiles[i][j];

/// use in loops or elsewhere
ij[k] = 'value'

不过,这仅在您不止一次访问同一级别时才有用。

关于javascript - 在javascript中循环实例化类使用最后一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17447089/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com