【问题标题】:for-loop and indexed array doesnt work [duplicate]for循环和索引数组不起作用[重复]
【发布时间】:2012-12-12 16:25:18
【问题描述】:

我想在每个第一个元素中创建一个带有索引号的二维数组。

(我之前的问题让我想到了这一点>)

这行得通:

$('#create_indexed_array').click(function() {
    var new_array = [[9,9],[9,9],[9,9],[9,9],[9,9]];
    for (var i = 0; i < 5; i++) {
        new_array[i][0] = i;
    }

    alert(JSON.stringify(new_array));

});

但这不起作用:

$('#create_indexed_array').click(function() {
    var new_array = new Array(new Array());
    for (var i = 0; i < 2; i++) {
        new_array[0][i] = ""; // create cols
    } 
    for (var i = 1; i < 5; i++) {
        new_array[i] = new_array[0]; // create rows
    }
    for (var i = 0; i < 5; i++) {
        new_array[i][0] = i; // set index
    }
    alert(JSON.stringify(new_array));

});

编辑: 我的最终工作版本(到目前为止):

var myArray  = [];
var rows = 5;
var cols = 2;

for (var i = 0; i < rows; i++) {
    myArray [i] = [];
    for (var j = 0; j < cols; j++) {
        if (j==0) myArray [i][j] = i;
        else myArray [i][j] = '';
    }
}

alert(JSON.stringify(myArray));

(r) 主要是 jfriend ;)

还是不知道为什么不能在开头声明二维数组:myArray = [[]]

【问题讨论】:

  • 此代码有效....不!并且用户名是 sasha...巧合?
  • 后两个 i 不需要 var。声明将被提升到函数的顶部。
  • 叫我男爵,jbabey --- 是的,重复,但我编辑了第一个(删除了原始问题),然后它似乎丢失了.. duno --- 是的,不需要第二个 var,但仅此而已不是问题吗?
  • @Bergi - 关闭在哪里?
  • @jfriend00:那个问题的标题里有“闭包”这个词,没有别的。不知道指的是什么。

标签: javascript arrays loops for-loop indexed


【解决方案1】:

按照您当前的模式,它将像这样工作:

$('#create_indexed_array').click(function() {
    var myArray = [[]];
    for (var i = 0; i < 2; i++) {
        myArray[0][i] = ""; // create cols
    } 
    for (i = 1; i < 5; i++) {
        // create copy of first row in each other row
        myArray[i] = myArray[0].slice(0); 
    }
    for (i = 0; i < 5; i++) {
        myArray[i][0] = i; // set index
    }
    alert(JSON.stringify(myArray));
});​

工作演示:http://jsfiddle.net/jfriend00/vJDPp/

您必须记住的一件事是,分配一个数组会分配一个对该数组的引用,而不是一个副本,因此如果您希望数组的每个元素都不同,您必须实际复制第一行以放置在随后的行中。我还建议更改 new_array 的名称,因为这听起来很像一个函数名称,以至于不知道代码的人读起来会感到困惑。


如果您只是想像在第一个代码示例中那样将 2D 数组初始化为全 9,那么这会简单得多:

$('#create_indexed_array').click(function() {
    var myArray = [];
    for (var i = 0; i < 5; i++) {
        myArray[i] = [];
        for (var j = 0; j < 2; j++) {
            myArray[i][j] = 9;
        }
    }
    alert(JSON.stringify(myArray));
});

或函数版本:

function create2DArray(lenX, lenY, initVal) {
    var myArray = [];
    for (var i = 0; i < lenX; i++) {
        myArray[i] = [];
        for (var j = 0; j < lenY; j++) {
            myArray[i][j] = initVal;
        }
    }
    return(myArray);
}

【讨论】:

  • 对,参考是问题所在。非常感谢大家!
  • @sasha - 我添加了一个更简单的二维数组初始化示例。
【解决方案2】:

为什么不将它与嵌入式 for 循环一起使用?

For(var i = 0; i < 2; i++) {
     For(var j = 0; j < 5; j++) {
          new_array[i][j] = i; //set index
     }
}

这样它一次设置索引。您必须先声明它。

之前的问题是您将它视为两个单独的数组、一个项目数组和一个由该项目数组组成的数组。二维数组是 1 个二维数组。

【讨论】:

  • 我认为您的意思是 for 而不是 For
  • 这不会产生与 OP 的第二个代码块试图做的结果相同的结果。
  • 我想我已经不习惯区分大小写的语言了,我的错。我想我完全错过了 OP 想要做什么?
猜你喜欢
  • 1970-01-01
  • 2020-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-03
  • 2015-01-05
相关资源
最近更新 更多