1

我正在尝试编写一个 Javascript 函数,通过给定的整数比例因子放大 2D Javascript 数组。“放大”数组的宽度和高度应该是原始数组宽度和高度的两倍,如下例所示。

function magnifyArray(arr, scaleFactor){
    // magnify arr by the given scale factor
}

var arr1 = [
    [0, 1],
    [1, 0]
]

var arr2 = magnifyArray(arr1, 2);
console.log(arr2);
//arr2 should now be:
//[[0, 0, 1, 1],
//[0, 0, 1, 1],
///[1, 1, 0, 0],
//[1, 1, 0, 0]
//]
4

4 回答 4

4

哦,丑陋的

function mag(matrix, scale) {
    var rows = matrix.length, cols = matrix[0].length;
    var mat = [];
    for (var i = 0; i < rows; i++) {
        var row = [];
        for (var j = 0; j < cols; j++) {
            for (var k = 0; k < scale; k++) {
                row.push(matrix[i][j]);
            }
        }
        for (var k = 0; k < scale; k++) {
            mat.push(row);
            // or use mat.push(row.slice(0)); to clone duplicate rows
        }
    }
    return mat;
}

请注意,当我复制行时,我不会克隆数组对象。如果您稍后修改一行,这可能会导致意外结果,但否则会提高效率。

于 2012-12-30T20:20:59.787 回答
3

这种递归方法适用于具有任意维数的数组:

function mag(arr, scale) {
    var res = [];
    if(!arr.length)
        return arr;
    for (var i = 0; i < arr.length; i++) {
        var temp = mag(arr[i], scale);
        for (var k = 0; k < scale; k++) {
            res.push(temp.slice ? temp.slice(0) : temp);
        }
    }
    return res;
}

对于非数组,它将返回对象本身。

小提琴:http: //jsfiddle.net/Q2T4J/4/

[编辑]:添加 .slice(0) 以将数组元素复制到新的数组对象(这对于您的场景可能不是必需的)

于 2012-12-30T20:34:26.477 回答
1

对于简单值数组的数组,magnifyArray 将生成您的示例结果。

function replicateEntries( a , x ) {
    var i, j, result = new Array();
    for ( i = 0 ; i < a.length ; ++i ) {
        for ( j = 0 ; j < x ; ++j ) result.push( a[i] );
    }
    return result;
}

function magnifyArray( a , x ) {
    var i, rows = new Array();
    for ( i = 0 ; i < a.length ; ++i ) {
        rows.push( replicateEntries( a[i] , x ) );
    }
    return replicateEntries( rows , x );
}
于 2012-12-30T20:21:20.610 回答
0

您将不得不以艰难而无聊的方式进行操作,因为其中不包含任何内容。

例如 :

var a =
[
[0, 1],
[1, 0]
];
var scale = 2;
​var b =​ [];
for (var i=0; i<a.length; i++) {
    var bi = [];
    var ai = a[i];
    for (var j=0; j<ai.length; j++) {
        for (var k=0; k<scale; k++)  bi.push(ai[j]);
    }
    for (var k=0; k<scale; k++)b.push(bi);
}​
于 2012-12-30T20:16:26.713 回答