1

2DJavascript配列を指定された整数スケール係数で拡大するJavascript関数を作成しようとしています。次の例に示すように、「拡大された」配列の幅と高さは、元の配列の幅と高さの2倍にする必要があります。

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;
}

not-arraysの場合、オブジェクト自体を返します。

フィドル: 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 に答える