我想在Javascript中创建一个二维数组,我将存储坐标(x,y)。我还不知道我将拥有多少对坐标,因为它们将由用户输入动态生成。
预定义的2d数组示例:
var Arr=[[1,2],[3,4],[5,6]];
我想我可以使用PUSH方法在数组末尾添加新记录。
如何声明一个空的二维数组,这样当我使用我的第一个Arr.push()时,它将被添加到索引0中,而push写入的每个下一个记录都将采用下一个索引?
这可能很容易做到,我只是JS的新手,如果有人可以写一个我可以检查的简短工作代码片段,我将不胜感激。感谢
答案 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)
const matrix = new Array(5).fill(0).map(() => new Array(4).fill(0));
5是行数,4是列数。
答案 3 :(得分:7)
大小为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
值。从next
,next().value
返回的值为undefined
。然后将此值undefined
传递到新创建的数组的迭代器。每次迭代的value
是undefined
,您可以查看是否将其记录下来。
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的矩阵数组