簡體   English   中英

在 Javascript 中聲明一個空的二維數組?

[英]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 ]

如果你想和創建一起初始化,你可以使用fillmap

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

5 是行數,4 是列數。

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

如果您希望能夠像這樣訪問矩陣 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值。 nextnext().value value 返回的next().valueundefined 這個值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);

ES6

 const rows = 2; const columns = 3; const matrix = [...Array(rows)].map(() => [...Array(columns)].fill(0)); console.log(matrix);

創建空矩陣的最簡單方法就是將其定義為空數組:

// Empty data structure
const matrix = []

但是,我們想用預先知道的nm參數來表示類似於網格的東西,然后我們可以使用它來代替。

// 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'

這個應該工作:

const arr = new Array(5).fill().map(_ => new Array(5).fill(0)) // ✅

您可能會問為什么我使用 map 而不是:

const badArr = new Array(5).fill(new Array(5).fill(0)) // ❌

上面示例的問題在於它添加了對傳遞給 fill 方法的數組的引用:

在此處輸入圖像描述

雖然這個工作正常:

在此處輸入圖像描述

怎么了

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM