0

jiddle - 我有x*y array一些默认创建的函数value。我希望这个值是一些 2 长的数组。但似乎通过传递new Array(2),因为parameter它总是传递相同的对象,所以稍后更改数组中的任何单元格都会影响所有单元格。如何使这个数组default的每个单元格的每个值都相同,但independent也一样。

在小提琴上,我更改了某些字段的值并警告依赖于第一个字段的其他字段,因为每个单元格都具有作为同一对象的默认值。

4

1 回答 1

1

我有创建x*y具有一些默认值的数组的函数。我希望这个值是一些 2 长的数组

但是它不再是一个x*y二维数组,而是一个x*y*23 维数组!为此,您需要一个不同的功能。

似乎通过new Array(2)作为参数传递它总是传递相同的对象,因此稍后更改数组中的任何单元格都会影响所有单元格。

是的。new Array(2)创建一个对象,您的代码构造一个二维数组,每个字段都指向它。

如何让他们独立?

您需要使用不同的功能,例如

function newB(x, y, z) {
    var result = new Array(x);
    for (var i=0; i<x; i++) {
        result[i] = new Array(y);
        for (var j=0; j<y; j++) {
            result[i][j] = new Array(z);
        }
    }
    return result;
}

var fields = newA(5, 5, 2);

或者为了更通用,你可以使用一些工厂函数作为参数,它构造了独立的值:

function newB(x, y, valuemaker) {
    if (typeof valuemaker != "function") {
        var value = valuemaker || 0;
        valuemaker = function(){ return value; };
    }
    var result = new Array(x);
    for (var i=0; i<x; i++) {
        result[i] = new Array(y);
        for (var j=0; j<y; j++) {
            result[i][j] = valuemaker();
        }
    }
    return result;
}

var fields = newA(5, 5, function() {
    return new Array(2);
});
于 2013-03-26T01:45:29.173 回答