在Javascript中声明一个空的二维数组?

时间:2013-08-10 15:12:42

标签: javascript arrays dynamic 2d push

我想在Javascript中创建一个二维数组,我将存储坐标(x,y)。我还不知道我将拥有多少对坐标,因为它们将由用户输入动态生成。

预定义的2d数组示例:

var Arr=[[1,2],[3,4],[5,6]];

我想我可以使用PUSH方法在数组末尾添加新记录。

如何声明一个空的二维数组,这样当我使用我的第一个Arr.push()时,它将被添加到索引0中,而push写入的每个下一个记录都将采用下一个索引?

这可能很容易做到,我只是JS的新手,如果有人可以写一个我可以检查的简短工作代码片段,我将不胜感激。感谢

20 个答案:

答案 0 :(得分:68)

你可以像这样声明一个常规数组:

var arry = [];

然后当你有一对要添加到数组的值时,你需要做的就是:

arry.push([value_1, value2]);

是的,第一次调用arry.push时,这对值将放在索引0处。

来自nodejs repl:

> var arry = [];
undefined
> arry.push([1,2]);
1
> arry
[ [ 1, 2 ] ]
> arry.push([2,3]);
2
> arry
[ [ 1, 2 ], [ 2, 3 ] ]

当然,由于javascript是动态类型的,因此没有类型检查器强制该数组保持二维。您必须确保只添加坐标对,而不是执行以下操作:

> arry.push(100);
3
> arry
[ [ 1, 2 ],
  [ 2, 3 ],
  100 ]

答案 1 :(得分:21)

如果您希望能够像这样访问矩阵 矩阵[i] [j]

我发现在循环中初始化它是最方便的。

var matrix = [],
    cols = 3;

//init the grid matrix
for ( var i = 0; i < cols; i++ ) {
    matrix[i] = []; 
}

这会给你     [[],[],[]]

所以     矩阵[0] [0]     矩阵[1] [0] 返回undefined而不是错误“Uncaught TypeError:无法设置未定义属性'0'

答案 2 :(得分:16)

如果要在创建时进行初始化,则可以使用fillmap

const matrix = new Array(5).fill(0).map(() => new Array(4).fill(0));

5是行数,4是列数。

答案 3 :(得分:7)

ES6

大小为3行5列的矩阵m

[...Array(3)].map(x=>Array(5).fill(0))       

let m = [...Array(3)].map(x=>Array(5).fill(0));

m[1][0] = 2;  // second row, first column
m[2][4] = 8;  // last element

// print formated array
console.log(JSON.stringify(m)
  .replace(/(\[\[)(.*)(\]\])/g,'[\n  [$2]\n]').replace(/],/g,'],\n  ')
);

.fill(0)移到不为零的位置。奖金

let Array2D = (r,c) => [...Array(r)].map(x=>Array(c).fill(0));
let b = Array2D(5,7);
console.log(JSON.stringify(b));

答案 4 :(得分:6)

您可以使用简写语法将一个数组嵌套在另一个数组中:

   var twoDee = [[]];

答案 5 :(得分:5)

通过省略值来定义空数组,如下所示:

v=[[],[]]
a=[]
b=[1,2]
a.push(b)
b==a[0]

答案 6 :(得分:5)

您可以尝试这样的事情: -

var arr = new Array([]);

推送数据:

arr[0][0] = 'abc xyz';

答案 7 :(得分:2)

创建一个对象并将该对象推入数组

 var jSONdataHolder = function(country, lat, lon) {

    this.country = country;
    this.lat = lat;
    this.lon = lon;
}

var jSONholderArr = [];

jSONholderArr.push(new jSONdataHolder("Sweden", "60", "17"));
jSONholderArr.push(new jSONdataHolder("Portugal", "38", "9"));
jSONholderArr.push(new jSONdataHolder("Brazil", "23", "-46"));

var nObj = jSONholderArr.length;
for (var i = 0; i < nObj; i++) {
   console.log(jSONholderArr[i].country + "; " + jSONholderArr[i].lat + "; " + 
   jSONholderArr[i].lon);

}

答案 8 :(得分:2)

我知道这是一个旧线程,但是我建议使用array of objects而不是array of arrays。我认为这使代码更易于理解和更新。

// Use meaningful variable names like 'points', 
// anything better than a bad pirate joke, 'arr'!
var points = [];

// Create an object literal, then add it to the array
var point = {x: 0, y: 0};
points.push(point);

// Create and add the object to the array in 1 line
points.push({x:5, y:5});

// Create the object from local variables 
var x = 10;
var y = 8;
points.push({x, y});

// Ask the user for a point too
var response = prompt("Please enter a coordinate point. Example: 3,8");
var coords = response.split(",").map(Number);
points.push({x: coords[0], y: coords[1]});

// Show the results
var canvas = document.getElementById('graph');
var painter = canvas.getContext("2d");
var width = canvas.width, height = canvas.height;
var scale = 10, radius = 3.5, deg0 = 0, deg360 = 2 * Math.PI;

painter.beginPath();
for (var point of points) {
    var x = point.x * scale + scale;
    var y = height - point.y * scale - scale;
    painter.moveTo(x + radius, y);
    painter.arc(x, y, radius, deg0, deg360);
    painter.fillText(`${point.x}, ${point.y}`, x + radius + 1, y + radius + 1);
}
painter.stroke();
<canvas id="graph" width="150" height="150" style="border: 1px solid red;"></canvas>

答案 9 :(得分:2)

您可以使用函数填充数组:

var arr = [];
var rows = 11;
var columns = 12;

fill2DimensionsArray(arr, rows, columns);

function fill2DimensionsArray(arr, rows, columns){
    for (var i = 0; i < rows; i++) {
        arr.push([0])
        for (var j = 0; j < columns; j++) {
            arr[i][j] = 0;
        }
    }
}

结果是:

var arr = [];
var rows = 11;
var columns = 12;

fill2DimensionsArray(arr, rows, columns);

function fill2DimensionsArray(arr, rows, columns){
    for (var i = 0; i < rows; i++) {
        arr.push([0])
        for (var j = 0; j < columns; j++) {
            arr[i][j] = 0;
        }
    }
}

答案 10 :(得分:2)

有什么问题
var arr2 = new Array(10,20);
    arr2[0,0] = 5;
    arr2[0,1] = 2
    console.log("sum is   " + (arr2[0,0] +  arr2[0,1]))

应该读出“sum is 7”

答案 11 :(得分:1)

const grid = Array.from(Array(3), e => Array(4));

Array.from(arrayLike, mapfn)

mapfn被调用,传递值undefined,返回new Array(4)

创建一个迭代器,并反复调用next值。从nextnext().value返回的值为undefined。然后将此值undefined传递到新创建的数组的迭代器。每次迭代的valueundefined,您可以查看是否将其记录下来。

var grid2 = Array.from(Array(3), e => {
  console.log(e); // undefined
  return Array(4); // a new Array.
});

答案 12 :(得分:1)

一个班轮

let m = 3 // rows
let n = 3 // columns
let array2D = Array(m).fill().map(entry => Array(n))

此实现为每个条目创建一个唯一的子数组。因此设置 array2D[0][1] = 'm' 不会将每个条目的 [1] 索引设置为 'm'

答案 13 :(得分:0)

如果我们不使用ES2015并且没有fill(),只需使用.apply()

请参见https://stackoverflow.com/a/47041157/1851492

let Array2D = (r, c, fill) => Array.apply(null, new Array(r)).map(function() {return Array.apply(null, new Array(c)).map(function() {return fill})})

console.log(JSON.stringify(Array2D(3,4,0)));
console.log(JSON.stringify(Array2D(4,5,1)));

答案 14 :(得分:0)

//用于3 x 5阵列

new Array(3).fill(new Array(5).fill(0))

答案 15 :(得分:0)

无需太多麻烦!简单

这将创建2 * 3的字符串矩阵。

var array=[];
var x = 2, y = 3;
var s = 'abcdefg';

for(var i = 0; i<x; i++){
    array[i]=new Array();
      for(var j = 0; j<y; j++){
         array[i].push(s.charAt(counter++));
        }
    }

答案 16 :(得分:0)

var arr = [];
var rows = 3;
var columns = 2;

for (var i = 0; i < rows; i++) {
    arr.push([]); // creates arrays in arr
}
console.log('elements of arr are arrays:');
console.log(arr);

for (var i = 0; i < rows; i++) {
    for (var j = 0; j < columns; j++) {
        arr[i][j] = null; // empty 2D array: it doesn't make much sense to do this
    }
}
console.log();
console.log('empty 2D array:');
console.log(arr);

for (var i = 0; i < rows; i++) {
    for (var j = 0; j < columns; j++) {
        arr[i][j] = columns * i + j + 1;
    }
}
console.log();
console.log('2D array filled with values:');
console.log(arr);

答案 17 :(得分:0)

您可以在填充第一个数组时嵌套一个新数组:

let ROWS = 2,
    COLS = 6;
let arr = new Array(ROWS).fill(new Array(COLS).fill(-1));
Output:
arr = 
[
  [-1, -1, -1, -1, -1, -1],
  [-1, -1, -1, -1, -1, -1]
]

如果你感到困惑,让我们通过声明/填充 1 个数组来分解它: 新建一个大小为d的数组,填充任意初始值

let arr1d = new Array(d).fill(<whatever_fill_val>);

现在,不是用 int/string/etc 填充第一个数组,而是用另一个数组填充它,就像填充嵌套数组一样!

let arr = new Array(d).fill(new Array(n).fill(-1));

答案 18 :(得分:-1)

我们通常知道列数,但可能不知道行(记录)。以下是我在此处使用上述大部分内容的解决方案示例。 (对于那些在JS方面比我更有经验的人 - 几乎所有人 - 欢迎任何代码改进建议)

     var a_cols = [null,null,null,null,null,null,null,null,null];
     var a_rxc  = [[a_cols]];

     // just checking  var arr =  a_rxc.length ; //Array.isArray(a_rxc);
     // alert ("a_rxc length=" + arr) ; Returned 1 
     /* Quick test of array to check can assign new rows to a_rxc. 
        i can be treated as the rows dimension and  j the columns*/
       for (i=0; i<3; i++) {
          for (j=0; j<9; j++) {
            a_rxc[i][j] = i*j;
            alert ("i=" + i + "j=" + j + "  "  + a_rxc[i][j] );
           }
          if (i+1<3) { a_rxc[i+1] = [[a_cols]]; }
        }

如果将此数组传递给服务器,那么适用于我的ajax是

 $.post("../ajax/myservercode.php",
       {
        jqArrArg1 : a_onedimarray,
        jqArrArg2 : a_rxc
       },
       function(){  },"text" )
        .done(function(srvresp,status) { $("#id_PageContainer").html(srvresp);} ) 
        .fail(function(jqXHR,status) { alert("jqXHR AJAX error " + jqXHR + ">>" + status );} );

答案 19 :(得分:-1)

单行解决方案:

%d

它将创建值为0的矩阵数组