JavaScript - 来自输入的多维数组

时间:2012-08-08 05:09:11

标签: javascript

基本上,这是作业中的最后一个问题,我真的很茫然。 我需要创建一个交替的1和0的x×x矩阵,其中x是用户输入。 例如,如果用户输入2,矩阵看起来就像这样

0 1
1 0

如果用户输入4,则矩阵看起来像

0 1 0 1
1 0 1 0
0 1 0 1
1 0 1 0

...等 我已经搜索了堆栈溢出和其他论坛,我理解如何创建一个数组。 它只是交替的1和0以及如何显示它。 感谢有任何想法的人。

4 个答案:

答案 0 :(得分:2)

不要过于复杂化。您不需要标记条件,例如boolif?:。这非常简单。

var count = 4; // User specified matrix size
mat = []; // Empty array, to use as matrix.
for(var i=0; i<count; i++) {
    mat.push(new Array(count)); // Add a new row (reserved size) to the matrix
    for(var j=0; j<count; j++) {
       mat[i][j] = (i^j) % 2; // Insert an alternating 1 or 0 based on iteration.
    }
}

答案 1 :(得分:1)

您可以使用此功能:

function createArray(n) {
    var arr = [];                     // create new array
    var zeroStart = true;             // the first row should start with 0
    for (var i = 0; i < n; i++) {     // loop over n times
        arr[i] = [];                  // used because array is multidimensional
        var zero = zeroStart;         // starting zero should match the row start
        for (var j = 0; j < n; j++) { // again loop over n times
            arr[i][j] = zero ? 0 : 1; // if zero is true, assign 0; otherwise 1
            zero = !zero;             // negate the value of zero
        }
        zeroStart = !zeroStart;       // negate the value of the starting zero
    }
    return arr;                       // return the created array
}

可以像这样调用:

createArray(6);                       // create 6x6 array

答案 2 :(得分:1)

秘诀是将代码抽象为多个函数。如果将用于创建行的代码与用于创建矩阵的代码分开,则可以更轻松地将思考器包裹起来,而不是将所有内容都塞入一个宏功能中。

让我们首先解决更容易的问题 - 创建一行。看起来您希望控制返回行的长度以及第一个单元格的初始值,无论是1还是0。这需要一个带有两个参数的函数:

function makeMatrixRow(size, initialValue) { }

所需的代码非常简单:

function makeMatrixRow(size, initialValue) {
    var n = [];

    for (var i = 0, flag = !!initialValue;
             i < size;
             i++, flag = !flag) {
        n.push(0+flag+0);
    }

    return n;
}

我已将大部分逻辑推入for循环的定义中。解构不应该太难。唯一棘手的位是“!! initialValue”和“0 + flag + 0”。第一个将initialValue转换为true / false值(布尔值)。第二个将这个布尔值变回一个数字。显然我不需要在两侧加零,但我喜欢它的对称性 - 而且我觉得它看起来像杠铃这样:)

使用该功能可以轻松生成矩阵。没有摆弄嵌套循环。问题已经减少到简单的迭代来填充数组:

function makeMatrix(size) {
    var matrix = [];
    for (var i = 0; i < size; i++) {
        matrix.push(makeMatrixRow(size, i % 2 == 0));
    }
    return matrix;
}

i%2 == 0正在测试均匀度。将其拆分为自己的变量赋值可能更好,而不是直接传递它。这里或那里的额外变量可以充分替代评论:

for (var i = 0; i < size; i++) {
    var isEvenRow = (i % 2 == 0);
    matrix.push(makeMatrixRow(size, isEvenRow));
}

就是这样!现在,这就是代码的样子:

function makeMatrixRow(size, initialValue) {
    var n = [];

    for (var i = 0, flag = !!initialValue;
             i < size;
             i++, flag = !flag) {
        n.push(0+flag+0);
    }

    return n;
}


function makeMatrix(size) {
    var matrix = [];
    for (var i = 0; i < size; i++) {
        matrix.push(makeMatrixRow(size, i % 2 == 0));
    }
    return matrix;
}

即使它更长一点,我更喜欢单一的功能解决方案......但是每个人都有自己的解决方案!

答案 3 :(得分:0)

function mArray(num){
   var a = [];
   var b = false;
   for(var z=0; z<num; z++){
      a[z] = [];
      b = false;
      for(var i=0; i<num; i++){
         a[z][i] = (b)? 1: 0;
         b = !b;
      }
   }
}

这应该有效。

mArray(4); // to create a 4x4 array