[英]Declare an empty two-dimensional array in Javascript?
我想在 Javascript 中創建一個二維數組,我將在其中存儲坐標 (x,y)。 我還不知道我將擁有多少對坐標,因為它們將由用戶輸入動態生成。
預定義二維數組示例:
var Arr=[[1,2],[3,4],[5,6]];
我想我可以使用 PUSH 方法在數組末尾添加一條新記錄。
我如何聲明一個空的二維數組,以便當我使用我的第一個 Arr.push() 時,它將被添加到索引 0,並且 push 寫入的每條下一條記錄都將采用下一個索引?
這可能很容易做到,我只是 JS 的新手,如果有人可以編寫一個我可以檢查的簡短工作代碼片段,我將不勝感激。 謝謝
您可以像這樣聲明一個常規數組:
var arry = [];
然后,當您有一對值要添加到數組時,您需要做的就是:
arry.push([value_1, value2]);
是的,第一次調用arry.push
,這對值將被放置在索引 0 處。
從 nodejs 復制:
> 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 ]
矩陣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 ') );
如果您希望能夠像這樣訪問矩陣 matrix[i][j]
我發現在循環中初始化它最方便。
var matrix = [],
cols = 3;
//init the grid matrix
for ( var i = 0; i < cols; i++ ) {
matrix[i] = [];
}
這會給你 [ [], [], [] ]
所以矩陣[0][0]矩陣[1][0]返回未定義而不是錯誤“未捕獲的類型錯誤:無法設置未定義的屬性'0'”
您可以使用速記語法將一個數組嵌套在另一個數組中:
var twoDee = [[]];
你可以嘗試這樣的事情:-
var arr = new Array([]);
推送數據:
arr[0][0] = 'abc xyz';
空數組是通過省略值來定義的,如下所示:
v=[[],[]]
a=[]
b=[1,2]
a.push(b)
b==a[0]
我知道這是一個舊線程,但我想建議使用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>
您可以使用函數用數組填充數組:
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]
const grid = Array.from(Array(3), e => Array(4));
Array.from(arrayLike, mapfn)
mapfn
被調用,被傳遞值undefined
,返回new Array(4)
。
創建迭代器並重復調用next
值。 從next
, next().value
value 返回的next().value
是undefined
。 這個值undefined
然后被傳遞給新創建的數組的迭代器。 每次迭代的value
都是undefined
,如果你記錄它,你可以看到它。
var grid2 = Array.from(Array(3), e => {
console.log(e); // undefined
return Array(4); // a new Array.
});
創建一個對象並將該對象推入一個數組
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);
}
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);
const rows = 2; const columns = 3; const matrix = [...Array(rows)].map(() => [...Array(columns)].fill(0)); console.log(matrix);
創建空矩陣的最簡單方法就是將其定義為空數組:
// Empty data structure
const matrix = []
但是,我們想用預先知道的n
和m
參數來表示類似於網格的東西,然后我們可以使用它來代替。
// n x m data structure
const createGrid = (n, m) => [...Array(n)].map(() => [...Array(m)].fill(0))
const grid = createGrid(3, 5)
這是一個簡單的片段,展示了如何使用它們。
const createGrid = (n, m) => [...Array(n)].map(() => [...Array(m)].fill(0)) const toString = m => JSON.stringify(m).replace(/(\[\[)(.*)(]])/g, '[\n [$2]\n]').replace(/],/g, '],\n ') // Empty data structure const matrix = [] console.log(toString(matrix)) matrix.push([1,2,3]) matrix.push([4,5,6]) matrix.push([7,8,9]) console.log(toString(matrix)) // nxm data structure const grid = createGrid(3, 5) console.log(toString(grid))
如果我們不使用 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)));
沒必要做那么多麻煩! 這很簡單
這將創建 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++));
}
}
一行解決方案:
var x = 3, y = 4;
var ar = new Array(x).fill(new Array(y).fill(0));
它創建值 = 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));
一個班輪
let m = 3 // rows
let n = 3 // columns
let array2D = Array(m).fill().map(entry => Array(n))
此實現為每個條目創建一個唯一的子數組。 因此,設置array2D[0][1] = 'm'
不會將每個條目的 [1] 索引設置為 'm'
怎么了
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”
const dp=new Array(3).fill(new Array(3).fill(-1))
它將創建以下數組:
[ [ -1, -1, -1 ], [ -1, -1, -1 ], [ -1, -1, -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 );} );
// 對於 3 x 5 數組
new Array(3).fill(new Array(5).fill(0))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.