96

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

预定义二维数组的示例:

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

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

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

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

4

19 回答 19

104

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

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 ]
于 2013-08-10T15:24:27.000 回答
80

如果要在创建过程中进行初始化,可以使用fillmap

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

5是行数,4是列数。

于 2018-09-11T03:34:38.910 回答
51

ES6

m大小为 3 行 5 列的矩阵(删除.fill(0)为不初始化为零)

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

let Array2D = (r,c) => [...Array(r)].map(x=>Array(c).fill(0));

let m = Array2D(3,5);

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

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

于 2018-10-28T08:39:31.537 回答
32

如果您希望能够像这样访问矩阵:

matrix[i][j]

我发现循环初始化它最方便。

var matrix = [],
    cols = 3;

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

这会给你

[ [], [], [] ]

所以

matrix[0][0]
matrix[1][0]

返回undefined而不是错误“未捕获的类型错误:无法设置未定义的属性'0'”。

于 2015-04-26T18:46:08.823 回答
12

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

   var twoDee = [[]];
于 2013-08-10T15:18:23.693 回答
7

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

var arr = new Array([]);

推送数据:

arr[0][0] = 'abc xyz';
于 2013-08-10T15:16:01.423 回答
4

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

v=[[],[]]
a=[]
b=[1,2]
a.push(b)
b==a[0]
于 2013-08-10T15:17:59.473 回答
3

我知道这是一个旧线程,但我想建议使用 anarray 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>

于 2020-07-19T09:45:58.007 回答
3

一个班轮

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

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

于 2021-07-16T15:04:48.940 回答
3

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

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

结果是:

Array(11)
0:(12) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
1:(12) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
2:(12) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
3:(12) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
4:(12) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
5:(12) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
6:(12) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
7:(12) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
8:(12) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
9:(12) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
10:(12)[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

于 2018-03-08T11:02:07.437 回答
2
const grid = Array.from(Array(3), e => Array(4));

Array.from(arrayLike, mapfn)

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

创建一个迭代器并next重复调用该值。next从,返回的值next().valueundefined。然后将该值undefined传递给新创建的数组的迭代器。每次迭代value都是undefined,如果您记录它,您可以看到它。

var grid2 = Array.from(Array(3), e => {
  console.log(e); // undefined
  return Array(4); // a new Array.
});
于 2020-04-02T00:17:12.277 回答
1

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

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

}
于 2019-03-21T11:33:04.570 回答
1

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

于 2020-06-15T17:57:03.493 回答
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)));

于 2019-07-27T15:03:16.060 回答
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++));
        }
    }
于 2020-05-03T15:13:49.553 回答
-1

有什么问题

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

应该读出“总和为 7”

于 2017-06-20T06:24:05.987 回答
-2

我们通常知道列数,但可能不知道行(记录)。这是我的解决方案的一个示例,它利用了上述大部分内容。(对于那些在 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 );} );
于 2016-09-15T00:19:44.990 回答
-2

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

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

于 2021-07-12T21:45:03.077 回答
-5

// 对于 3 x 5 数组

new Array(3).fill(new Array(5).fill(0))
于 2019-08-19T21:52:38.277 回答