我一直在网上阅读,一些地方说这是不可能的,一些地方说这是可能的,然后给出一个例子,另一些地方反驳这个例子,等等。
如何在JavaScript中声明一个2维数组?(假设这是可能的) 我如何访问它的成员?(myArray[0][1] or myArray[0,1]?)
我一直在网上阅读,一些地方说这是不可能的,一些地方说这是可能的,然后给出一个例子,另一些地方反驳这个例子,等等。
如何在JavaScript中声明一个2维数组?(假设这是可能的) 我如何访问它的成员?(myArray[0][1] or myArray[0,1]?)
实际上呢?是的。你可以创建一个数组的数组,作为一个2D数组,因为每个项目本身就是一个数组: Let items = [ (1、2), (3、4), (5、6) ]; console.log(项目[0][0]);/ / 1 console.log(项目[0][1]);/ / 2 console.log(项目[1][0]);/ / 3 console.log(项目[1][1]);/ / 4 console.log(项目);
但从技术上讲,这只是一个数组的数组,而不是一个“真正的”2D数组,正如I. J. Kennedy指出的那样。
需要注意的是,您可以将数组嵌套到另一个数组中,从而创建“多维”数组。
二维数组的创建方式与一维数组相同。你像数组[0][1]一样访问它们。
var arr = [1, 2, [3, 4], 5];
alert (arr[2][1]); //alerts "4"
只需将数组中的每个项设置为数组。
var x = new Array(10); For (var I = 0;I < x.length;我+ +){ x[i] = new Array(3); } console.log (x);
Javascript只有一维数组,但正如其他人指出的那样,你可以构建数组的数组。
下面的函数可以用来构造一个固定维度的二维数组:
function Create2DArray(rows) {
var arr = [];
for (var i=0;i<rows;i++) {
arr[i] = [];
}
return arr;
}
列的数量其实并不重要,因为在使用数组之前不需要指定数组的大小。
然后你可以调用:
var arr = Create2DArray(100);
arr[50][2] = 5;
arr[70][5] = 7454;
// ...
您可以分配一个行数组,其中每一行都是相同长度的数组。或者你也可以用rows*columns元素分配一个一维数组,并定义方法将行/列坐标映射到元素索引。
无论选择哪种实现,如果将其包装在对象中,则可以在原型中定义访问器方法,从而使API易于使用。
有人说这不可能是因为二维数组实际上就是数组的数组。这里的其他注释提供了在JavaScript中创建二维数组的完全有效的方法,但最纯粹的观点是,你有一个一维对象数组,每个对象都是由两个元素组成的一维数组。
这就是观点冲突的原因。
类似于activa的答案,这里有一个创建n维数组的函数:
function createArray(length) {
var arr = new Array(length || 0),
i = length;
if (arguments.length > 1) {
var args = Array.prototype.slice.call(arguments, 1);
while(i--) arr[length-1 - i] = createArray.apply(this, args);
}
return arr;
}
createArray(); // [] or new Array()
createArray(2); // new Array(2)
createArray(3, 2); // [new Array(2),
// new Array(2),
// new Array(2)]
我不确定是否有人回答过这个问题,但我发现这对我很有效
var array = [[,],[,]]
eg:
var a = [[1,2],[3,4]]
例如,对于一个二维数组。
我必须使一个灵活的数组函数添加“记录”到它,因为我需要,并能够更新它们,做任何计算e需要在我把它发送到数据库进行进一步处理。下面是代码,希望能有所帮助:)。
function Add2List(clmn1, clmn2, clmn3) {
aColumns.push(clmn1,clmn2,clmn3); // Creates array with "record"
aLine.splice(aPos, 0,aColumns); // Inserts new "record" at position aPos in main array
aColumns = []; // Resets temporary array
aPos++ // Increments position not to overlap previous "records"
}
请随意优化和/或指出任何错误:)
很少有人会使用“推”: 为了带来一些新的东西,我将向您展示如何用一些值初始化矩阵,例如:0或空字符串“”。 提醒一下,如果你有一个10个元素的数组,在javascript的最后一个索引将是9!
function matrix( rows, cols, defaultValue){
var arr = [];
// Creates all lines:
for(var i=0; i < rows; i++){
// Creates an empty line
arr.push([]);
// Adds cols to the empty line:
arr[i].push( new Array(cols));
for(var j=0; j < cols; j++){
// Initializes:
arr[i][j] = defaultValue;
}
}
return arr;
}
使用例子:
x = matrix( 2 , 3,''); // 2 lines, 3 cols filled with empty string
y = matrix( 10, 5, 0);// 10 lines, 5 cols filled with 0
如果你是在谷歌图表的2D数组,最好的方法是
var finalData = [];
[["key",value], ["2013-8-5", 13.5], ["2013-7-29",19.7]...]
指的是 不是一个有效的2d数组谷歌图表
最简单的方法:
var arr = [];
var arr1 = ['00','01'];
var arr2 = ['10','11'];
var arr3 = ['20','21'];
arr.push(arr1);
arr.push(arr2);
arr.push(arr3);
alert(arr[0][1]); // '01'
alert(arr[1][1]); // '11'
alert(arr[2][0]); // '20'
var _field = (function()
{
var array = [];
for(var y = 0; y != 3; y++) { array[y] = new Array(5); }
return array;
})();
// var item = _field[2][4];
如果数组的大小未知会发生什么?或者数组应该动态创建和填充?另一种解决方案,为我工作是使用类与静态2d数组变量,在数组中不存在索引的情况下将启动它:
function _a(x,y,val){
// return depending on parameters
switch(arguments.length){
case 0: return _a.a;
case 1: return _a.a[x];
case 2: return _a.a[x][y];
}
// declare array if wasn't declared yet
if(typeof _a.a[x] == 'undefined')
_a.a[x] = [];
_a.a[x][y] = val;
}
// declare static empty variable
_a.a = [];
语法将是:
_a(1,1,2); // populates [1][1] with value 2
_a(1,1); // 2 or alternative syntax _a.a[1][1]
_a(1); // [undefined × 1, 2]
_a.a; // [undefined × 1, Array[2]]
_a.a.length
我发现下面是最简单的方法:
Var array1 = [[]]; Array1 [0][100] = 5; alert (array1 [0] [100]); 警报(array1.length); alert (array1 [0] . length);
两行:
var a = [];
while(a.push([]) < 10);
它将生成一个长度为10的数组a,其中充满数组。 (Push将一个元素添加到数组中并返回新的长度)
我发现这段代码适合我:
var map = [
[]
];
mapWidth = 50;
mapHeight = 50;
fillEmptyMap(map, mapWidth, mapHeight);
...
function fillEmptyMap(array, width, height) {
for (var x = 0; x < width; x++) {
array[x] = [];
for (var y = 0; y < height; y++) {
array[x][y] = [0];
}
}
}
要在javaScript中创建一个2D数组,我们可以先创建一个数组,然后添加数组作为它的元素。此方法将返回具有给定行数和列数的2D数组。
function Create2DArray(rows,columns) {
var x = new Array(rows);
for (var i = 0; i < rows; i++) {
x[i] = new Array(columns);
}
return x;
}
使用如下所示的方法创建Array。
var array = Create2DArray(10,20);
我修改了Matthew Crumley关于创建多维数组函数的回答。我已经添加了要作为数组变量传递的数组的维度,还有另一个变量- value,它将用于设置多维数组中最后一个数组的元素的值。
/*
* Function to create an n-dimensional array
*
* @param array dimensions
* @param any type value
*
* @return array array
*/
function createArray(dimensions, value) {
// Create new array
var array = new Array(dimensions[0] || 0);
var i = dimensions[0];
// If dimensions array's length is bigger than 1
// we start creating arrays in the array elements with recursions
// to achieve multidimensional array
if (dimensions.length > 1) {
// Remove the first value from the array
var args = Array.prototype.slice.call(dimensions, 1);
// For each index in the created array create a new array with recursion
while(i--) {
array[dimensions[0]-1 - i] = createArray(args, value);
}
// If there is only one element left in the dimensions array
// assign value to each of the new array's elements if value is set as param
} else {
if (typeof value !== 'undefined') {
while(i--) {
array[dimensions[0]-1 - i] = value;
}
}
}
return array;
}
createArray([]); // [] or new Array()
createArray([2], 'empty'); // ['empty', 'empty']
createArray([3, 2], 0); // [[0, 0],
// [0, 0],
// [0, 0]]
递归函数创建多维数组:
var makeArray = function (dims, arr) {
if (dims[1] === undefined) {
return new Array(dims[0]);
}
arr = new Array(dims[0]);
for (var i=0; i<dims[0]; i++) {
arr[i] = new Array(dims[1]);
arr[i] = makeArray(dims.slice(1), arr[i]);
}
return arr;
}
构建一个2x3x4x2的4D-Array:
var array = makeArray([2, 3, 4, 2]);
Javascript不支持二维数组,相反,我们将一个数组存储在另一个数组中,并根据您想访问的数组的位置从该数组中获取数据。记住数组编号从0开始。
代码示例:
/* Two dimensional array that's 5 x 5
C0 C1 C2 C3 C4
R0[1][1][1][1][1]
R1[1][1][1][1][1]
R2[1][1][1][1][1]
R3[1][1][1][1][1]
R4[1][1][1][1][1]
*/
var row0 = [1,1,1,1,1],
row1 = [1,1,1,1,1],
row2 = [1,1,1,1,1],
row3 = [1,1,1,1,1],
row4 = [1,1,1,1,1];
var table = [row0,row1,row2,row3,row4];
console.log(table[0][0]); // Get the first item in the array
你也可以创建一个函数来创建一个2D数组,就像这样:
var myTable = [];
function createArray(myLength) {
myTable = new Array(myLength);
var cols, rows;
for (cols = 0; cols < myLength; cols++) {
myTable[cols] = new Array(myLength);
}
}
您可以使用以下命令调用它,这将为您提供一个10x10的2D数组。
createArray(10);
您还可以使用此方法创建3D数组。
这里有一个很棒的仓库。
API: masfufa.js 示例:masfufa.html
两个示例将足以理解这个库:
示例1:
/* | 1 , 2 , 3 |
* MX= | 4 , 5 , 6 | Dimensions= 3 x 3
* | 7 , 8 , 9 |
*/
jsdk.getAPI('my');
var A=[1, 2, 3, 4, 5, 6, 7, 8, 9];
var MX=myAPI.getInstance('masfufa',{data:A,dim:'3x3'});
然后:
MX.get[0][0] // -> 1 (first)
MX.get[2][2] // ->9 (last)
示例2:
/* | 1 , 9 , 3 , 4 |
* MXB= | 4 , 5 , 6 , 2 | Dimensions= 2 x 4
*
*/
var B=[1 , 9 , 3 , 4 , 4 , 5 , 6 , 2];
var MXB=myAPI.getInstance('masfufa',{data:B,dim:'2x4'});
然后:
MXB.get[0][0] // -> 1 (first)
MXB.get[1][3] // -> 2 (last)
MXB.get[1][2] // -> 6 (before last)
nodejs + lodash版本:
var _ = require("lodash");
var result = _.chunk(['a', 'b', 'c', 'd', 'e', 'f'], 2);
console.log(result);
console.log(result[2][0]);
输出:
[ [ 'a', 'b' ], [ 'c', 'd' ], [ 'e', 'f' ] ]
e
最明智的答案似乎是
var nrows = ~~(随机数学)* 10); var ncols = ~~(随机数学)* 10); 游戏机。log (rows:美元(nrows)); 游戏机。log(离职:美元(ncols)); var矩阵=新阵列(nrows)。地图(row =>新阵列(ncols).fill(0)); 游戏机。log(《黑客帝国》);
请注意,我们不能直接填充行,因为填充使用浅复制构造函数,因此所有行将共享相同的内存…下面是演示如何共享每一行的示例(取自其他答案):
// DON'T do this: each row in arr, is shared
var arr = Array(2).fill(Array(4));
arr[0][0] = 'foo'; // also modifies arr[1][0]
console.info(arr);
这是我发现的一个制作二维数组的快速方法。
function createArray(x, y) {
return Array.apply(null, Array(x)).map(e => Array(y));
}
您还可以轻松地将该函数转换为ES5函数。
function createArray(x, y) {
return Array.apply(null, Array(x)).map(function(e) {
return Array(y);
});
}
为什么这样工作:新的Array(n)构造函数创建了一个带有Array原型的对象。原型,然后分配对象的长度,导致一个未填充的数组。由于它缺乏实际成员,我们不能在它上运行Array.prototype.map函数。
然而,当您向构造函数提供多个参数时,例如执行Array(1,2,3,4)时,构造函数将使用arguments对象正确地实例化和填充Array对象。
因此,我们可以使用Array。apply(null, Array(x)),因为apply函数会将参数分散到构造函数中。为了澄清,执行Array。apply(null, Array(3))等价于执行Array(null, null, null)。
现在我们已经创建了一个实际的填充数组,我们所需要做的就是调用map并创建第二层(y)。
这就是我的成就:
var appVar = [[]]; appVar[0][4] = "bineesh"; appVar[0][5] = "kumar"; console.log(appVar[0][4] + appVar[0][5]); console.log (appVar);
这把我拼成了bineeshkumar
使用数组推导式
在JavaScript 1.7及更高版本中,您可以使用数组推导式来创建二维数组。您还可以在填充数组时过滤和/或操作条目,而不必使用循环。
var rows = [1, 2, 3];
var cols = ["a", "b", "c", "d"];
var grid = [ for (r of rows) [ for (c of cols) r+c ] ];
/*
grid = [
["1a","1b","1c","1d"],
["2a","2b","2c","2d"],
["3a","3b","3c","3d"]
]
*/
您可以创建任何n x m的数组,并通过调用填充默认值
var default = 0; // your 2d array will be filled with this value
var n_dim = 2;
var m_dim = 7;
var arr = [ for (n of Array(n_dim)) [ for (m of Array(m_dim) default ]]
/*
arr = [
[0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0],
]
*/
更多示例和文档可以在这里找到。
请注意,这还不是一个标准功能。
下面,创建一个5x5矩阵,并将其填充为null
Var md = []; (var = 0;我< 5;我+ +){ md.push(新数组(5).fill (null)); } console.log (md);
我的方法与@Bineesh的答案非常相似,但采用了更普遍的方法。
你可以这样声明双数组:
var myDoubleArray = [[]];
并以以下方式存储和访问内容:
var testArray1 = [9,8]
var testArray2 = [3,5,7,9,10]
var testArray3 = {"test":123}
var index = 0;
myDoubleArray[index++] = testArray1;
myDoubleArray[index++] = testArray2;
myDoubleArray[index++] = testArray3;
console.log(myDoubleArray[0],myDoubleArray[1][3], myDoubleArray[2]['test'],)
这将打印预期的输出
[ 9, 8 ] 9 123
在一些注释中提到了这一点,但是使用array .fill()将有助于构造一个2-d数组:
function create2dArr(x,y) {
var arr = [];
for(var i = 0; i < y; i++) {
arr.push(Array(x).fill(0));
}
return arr;
}
这将在返回的数组中生成一个长度为x, y的数组。
对于一行程序爱好者来说
// creates 8x8 array filed with "0"
const arr2d = Array.from({ length: 8 }, () => Array.from({ length: 8 }, () => "0"))
另一个(来自dmitry_romanov的评论)使用Array().fill()
// creates 8x8 array filed with "0"
const arr2d = Array(8).fill(0).map(() => Array(8).fill("0"))
使用ES6+扩展操作符(“受InspiredJW启发”:))
// same as above just a little shorter
const arr2d = [...Array(8)].map(() => Array(8).fill("0"))
这是我的多维数组的实现。
在这种方法中,我创建了一个一维数组
我已经添加了一个原型函数多数组对象,它可以用来创建任何维度的数组。
我还为数组对象添加了一个原型函数索引,用于从多维索引中获取线性数组的索引。
创建Array
//Equivalent to arr[I][J][K]..[] in C
var arr = new Array().multi(I,J,K,..);
在任意索引处访问数组值
//Equivalent in C arr[i][j][k];
var vaue = arr[arr.index(i,j,k)];
片段
/* 存储数组为一维 使用Array.index(i,j,k,…) * / Array.prototype.multi = function(){ 这一点。Multi_size =参数; 这一点。Multi_len = 1 对于(参数的关键字)这个。Multi_len *= parameters [key]; (var i=0;i<this.multi_len;i++) this.push(0); 返回; } Array.prototype.index = function(){ Var _size = this.multi_len; Var temp = 1; Var指数= 0; 对于(参数中的关键字){ 临时* = this.multi_size(例子); 索引+ =(参数(例子)* (_size / temp)) } 返回索引; } //现在你可以使用多维数组 //一个3x3 2D矩阵 var ar2d = new Array().multi(3,3);//一个2D数组 Arr2d [Arr2d .index(1,1,1)] = 5; console.log (arr2d [arr2d.index (1 1 1)]); //一个3x3x3 3D矩阵 var arr3d = new Array().multi(3,3,3);//一个3D数组 Arr3d [Arr3d .index(1,1,1)] = 5; console.log (arr3d [arr3d.index (1 1 1)]); //一个4x3x3 4D矩阵 var arr4d = new Array().multi(4,3,3,3);//一个4D数组 Arr4d [Arr4d .index(4,0,0,1)] = 5; console.log (arr4d [arr4d.index (4 0 0,1)]);
var playList = [ ['I Did It My Way', 'Frank Sinatra'], ['Respect', 'Aretha Franklin'], [‘想象’,‘约翰·列侬’] 《为奔跑而生》《布鲁斯·斯普林斯汀》 [《路易·路易》,《王牌特工》], [《Maybellene》,《Chuck Berry》] ]; 函数print(message) { document . write(消息); } 函数printSongs(歌曲){ var listHTML; listHTML = '<ol>'; For (var I = 0;I < songs.length;I += 1) { 李listHTML + = ' < > ' +歌曲[我][0]+的”+歌曲[我][1]+ '李< / > '; } listHTML += '</ol>'; 打印(listHTML); } printSongs(播放列表);
如果你想要的是一个4x4矩阵,看看DOMMatrix,它很容易使用,我可以说,
let m = new DOMMatrix();
// m.m11, m.m12, m.m13, m.m14, ..., m.m41, m.m42, m.m43, m.m44
最初由于不同的原因,它在node.js上不可用,并且仅限于4x4。
你也可以考虑使用一个自动激活对象,而不是JS的数组,看看我的答案,但这里也带来了更多的说服力:
var tree = () => new Proxy({}, { get: (target, name) => name in target ? target[name] : target[name] = tree() });
var t = tree();
t[0][2][3] = 4;
console.log(t[0][2][3]);
它使用新的JS和行为不正确时,你迭代它,所以要小心它。
如果你需要一个灵活的多维数组生成器,也可以看看这个。
还有另一种解决方案,它不强迫你预先定义2d数组的大小,而且非常简洁。
Var表= {} table[[1,2]] = 3 //注意双[[and]] Console.log (table[[1,2]]) // -> 3 .单击“确定”
这是因为,[1,2]被转换为一个字符串,用作表对象的字符串键。
如何创建空二维数组(一行)
Array.from(Array(2), () => new Array(4))
2和4分别是一维和二维。
我们使用了Array.from,它可以接受一个类似数组的参数和每个元素的可选映射。
Array.from(arrayLike[, mapFn[, thisArg]])
var arr = Array.from(Array(2), () => new Array(4)); Arr [0][0] = 'foo'; console.info (arr);
同样的技巧可以用于创建包含1…N的JavaScript数组
或者(但当n = 10,000时效率更低,为12%)
Array(2).fill(null).map(() => Array(4))
性能下降的原因是我们必须初始化第一个维度的值才能运行.map。记住,数组不会分配位置,直到你通过.fill或直接赋值对它进行排序。
var arr =阵列(2).fill (null) . map(() = >阵列(4)); Arr [0][0] = 'foo'; console.info (arr);
跟进
这里有一个方法看起来是正确的,但有问题。
Array(2).fill(Array(4)); // BAD! Rows are copied by reference
虽然它确实返回了显然需要的二维数组([[<4空项>],[<4空项>]]),但有一个问题:一维数组是通过引用复制的。这意味着arr[0][0] = 'foo'实际上会改变两行而不是一行。
var arr =数组(2).fill(数组(4)); Arr [0][0] = 'foo'; console.info (arr); console.info (arr [0] [0], arr [1] [0]);
创建一个非稀疏的“2D”数组(x,y),所有的索引都是可寻址的,并且值设置为空:
let 2Darray = new Array(x).fill(null).map(item =>(new Array(y).fill(null)))
“3D”数组(x,y,z)
let 3Darray = new Array(x).fill(null).map(item=>(new Array(y).fill(null)).map(item=>Array(z).fill(null)))
关于这个问题的变化和更正已经在评论中提到,并在不同的地方回应了这个问题,但不是一个实际的答案,所以我在这里添加了它。
应该注意的是(类似于大多数其他答案),这有O(x*y)时间复杂度,所以它可能不适合非常大的数组。
var items = [
["January 01", 42.5],
["February 01", 44.3],
["March 01", 28.7],
["April 01", 44.3],
["May 01", 22.9],
["June 01", 54.4],
["July 01", 69.3],
["August 01", 19.1],
["September 01", 82.5],
["October 01", 53.2],
["November 01", 75.9],
["December 01", 58.7]
];
alert(items[1][0]); // February 01
alert(items[5][1]); // 54.4
为Java Script创建n维矩阵数组,填充初始默认值为0。
function arr (arg, def = 0){
if (arg.length > 2){
return Array(arg[0]).fill().map(()=>arr(arg.slice(1)));
} else {
return Array(arg[0]).fill().map(()=>Array(arg[1]).fill(def));
}
}
// Simple Usage of 4 dimensions
var s = arr([3,8,4,6])
// Use null default value with 2 dimensions
var k = arr([5,6] , null)
数组的行和列的大小只有在运行时才知道,那么下面的方法可以用来创建一个动态的2d数组。
var num = '123456'; 变量行 = 3;运行时已知 var col = 2;运行时已知 是 i = 0; var array2D = [[]]; for(var r = 0; r < row; ++r) { array2D[r] = []; for(var c = 0; c < col; ++c) { array2D[r][c] = num[i++]; } } console.log(array2D); [[ '1', '2' ], [ '3', '4' ], [ '5', '6' ]] console.log(array2D[2][1]);6
ES6+、ES2015+可以用更简单的方式做到这一点
创建3 × 2的数组,填充为true
[...Array(3)].map(item => Array(2).fill(true))
性能
今天2020.02.05,我在Chrome v79.0, Safari v13.0.4和Firefox v72.0上对MacOs HighSierra 10.13.6进行测试,以选择解决方案。
非初始化二维数组的结论
深奥的解{}/arr[[i,j]] (N)对于大小数组都是最快的,看起来对于大型稀疏数组也是不错的选择 基于for-[]/while (A,G)的求解速度较快,是小型数组的良好选择。 -[] (B,C)的解是快速的,对于大数组是很好的选择 基于Array..map/from/fill (I,J,K,L,M)对于小数组来说非常慢,而对于大数组来说非常快 for- array (n) (B,C)在safari上比for-[] (A)慢得多 令人惊讶的是,for-[] (A) for大数组在所有浏览器上都很慢 解决方案K对于所有浏览器的小数组都很慢 解决方案A,E,G对于所有浏览器的大数组都很慢 对于所有浏览器上的所有数组,解决方案M是最慢的
初始化二维数组的结论
基于for/while (A,B,C,D,E,G)的解决方案对于所有浏览器上的小数组来说都是最快的/相当快的 基于for (A,B,C,E)的解决方案对于大数组在所有浏览器上都是最快的/相当快的 基于Array..map/from/fill (I,J,K,L,M)在所有浏览器上都是中、快或慢的小数组 针对大数组的F,G,H,I,J,K,L解决方案在chrome和safari上中等或快速,但在firefox上最慢。 深奥的解决方案{}/arr[[i,j]] (N)对于所有浏览器上的大小数组都是最慢的
细节
测试没有填充(初始化)输出数组的解决方案
我们测试解的速度
小数组(12个元素)-你可以在你的机器上执行测试 大数组(100万个元素)数组-你可以在你的机器上执行测试
函数A(r) { Var arr = []; For (var I = 0;I < r;I ++) arr[I] = []; 返回arr; } 函数B(r, c) { var arr = new Array(r); For (var I = 0;I < arrr .length;i++) arr[i] = new Array(c); 返回arr; } 函数C(r, C) { var arr =数组(r); For (var I = 0;I < arrr .length;i++) arr[i] =数组(c); 返回arr; } 函数D(r, c) { //奇怪,但有效 Var arr = []; For (var I = 0;I < r;我+ +){ arr.push ([]); 加勒比海盗[我].push(数组(c)); } 返回arr; } 函数E(r, c) { Let array = [[]]; For (var x = 0;X < c;x + +) { 数组[x] = []; For (var y = 0;Y < r;数组[x][Y] = [0]; } 返回数组; } 函数F(r, c) { var makeArray = function(调暗,arr) { If (dims[1] === undefined) { 返回数组(dim [0]); } arr = Array(dimms [0]); For (var I = 0;I < dim [0];我+ +){ arr[i] = Array(dimms [1]); arr[i] = makeArray(dms .slice(1), arr[i]); } 返回arr; } 返回makeArray([r, c]); } 函数G(r) { Var a = []; While (a.push([]) < r); 返回一个; } 函数H(r,c) { 函数createArray(length) { var arr =新的数组(长度|| 0), I =长度; 如果参数。长度> 1){ var args = Array.prototype.slice。调用(参数,1); while(i——)arr[length-1 - i] = createArray。应用(这个,args); } 返回arr; } 返回createArray (r、c); } 函数I(r, c) { 返回数组(r)[…]。map(x =>数组(c)); } 函数J(r, c) { 返回Array(r).fill(0).map(() => Array(c)); } 函数K(r, c) { return Array.from(Array(r), () => Array(c)); } 函数L(r, c) { 返回Array.from({length: r})。map(e => Array(c)); } 函数M(r, c) { 返回Array.from({长度:r}, () = > Array.from({长度:c }, () => {})); } 函数N(r, c) { 返回{} } // ----------------------------------------------- / /显示 // ----------------------------------------------- Log = (t, f) => { 令A = f(3,4);//创建3行4列的数组 A[1][2] = 6 //第2行第3列设置为6 console.log(“$ {t}[1][2]: ${一个[1][2]},完整:$ {JSON.stringify (A) .replace(/空/ g,“x”)}”); } Log2 = (t, f) => { 令A = f(3,4);//创建3行4列的数组 A[[1,2]] = 6 //第2行第3列设为6 console.log(“$ {t}[1][2]: ${一个[[1,2]]},完整:$ {JSON.stringify (A) .replace(/空/ g,“x”)}”); } 日志(' A '); 日志(B, B); 日志(C, C); 日志(' D ' D); 日志(E, E); 日志(F, F); 日志(G, G); 日志(H, H); 日志(“我”,我); 日志(“J”,J); 日志(K, K); 日志(L, L); 日志(“M”,M); log2 (N, N); 这是解决方案的展示,而不是基准测试
测试填充(初始化)输出数组的解决方案
我们测试解的速度
小数组(12个元素)-你可以在你的机器上执行测试 大数组(100万个元素)数组-你可以在你的机器上执行测试
函数A(r, c, def) { Var arr = []; For (var I = 0;I < r;i++) arr[i] =数组(c).fill(def); 返回arr; } 函数B(r, c, def) { var arr = new Array(r); For (var I = 0;I < arrr .length;i++) arr[i] = new Array(c).fill(def); 返回arr; } 函数C(r, C, def) { var arr =数组(r); For (var I = 0;I < arrr .length;i++) arr[i] =数组(c).fill(def); 返回arr; } 函数D(r, c, def) { //奇怪,但有效 Var arr = []; For (var I = 0;I < r;我+ +){ arr.push ([]); 加勒比海盗[我].push(数组(c)); } For (var I = 0;I < r;i++) for (var j = 0;J < c;j + +) arr[我][j] = def 返回arr; } 函数E(r, c, def) { Let array = [[]]; For (var x = 0;X < c;x + +) { 数组[x] = []; For (var y = 0;Y < r;数组[x][Y] = def; } 返回数组; } 函数F(r, c, def) { var makeArray = function(调暗,arr) { If (dims[1] === undefined) { 返回数组(退去[0]).fill (def); } arr = Array(dimms [0]); For (var I = 0;I < dim [0];我+ +){ arr[i] = Array(dimms [1]); arr[i] = makeArray(dms .slice(1), arr[i]); } 返回arr; } 返回makeArray([r, c]); } 函数G(r, c, def) { Var a = []; while (a.push(Array(c).fill(def)) < r); 返回一个; } 函数H(r,c, def) { 函数createArray(length) { var arr =新的数组(长度|| 0), I =长度; 如果参数。长度> 1){ var args = Array.prototype.slice。调用(参数,1); while(i——)arr[length-1 - i] = createArray。应用(这个,args) .fill (def); } 返回arr; } 返回createArray (r、c); } 函数I(r, c, def) { 返回数组(r)[…]。map(x =>数组(c).fill(def)); } 函数J(r, c, def) { 返回数组(r) .fill (0) . map(() = >数组(c) .fill (def)); } 函数K(r, c, def) { 返回Array.from(Array(r), () => Array(c).fill(def)); } 函数L(r, c, def) { 返回Array.from({length: r})。map(e => Array(c).fill(def)); } 函数M(r, c, def) { 返回Array.from({长度:r}, () = > Array.from({长度:c}, () = > def)); } 函数N(r, c, def) { 让arr = {}; For (var I = 0;I < r;i++) for (var j = 0;J < c;j + +) arr [[i, j]] = def; 返回arr; } // ----------------------------------------------- / /显示 // ----------------------------------------------- Log = (t, f) => { 令A = f(1000,1000,7);//创建一个1000行1000列的数组 //每个数组单元格初始化为7 A[800][900] = 5 //第800行和第901列设为5 console.log(“$ {t}[1][2]: ${一个[1][2]},{t}美元[800][901]:${一个[800][900]}”); } Log2 = (t, f) => { 令A = f(1000,1000,7);//创建一个1000行1000列的数组 //每个数组单元格初始化为7 A[[800,900]] = 5 //第800行第900列设置为5 console.log(“$ {t}[1][2]: ${一个[[1,2]]},{t}美元[800][900]:${一个[[800900]]}'); } 日志(' A '); 日志(B, B); 日志(C, C); 日志(' D ' D); 日志(E, E); 日志(F, F); 日志(G, G); 日志(H, H); 日志(“我”,我); 日志(“J”,J); 日志(K, K); 日志(L, L); 日志(“M”,M); log2 (N, N); 这是解决方案的展示,而不是基准测试
我不喜欢使用.fill()的ES6解决方案。有些可能可以工作,但为了避免引用复制问题而添加的额外箍使它们不直观。
我建议的ES6方法是对外部数组和内部数组充分利用展开运算符。在我看来,这更容易解释。
[...Array(3)].map(() => [...Array(4)])
如果你需要设置一个初始值,那么你可以在内部数组创建时使用.map()链接:
[...Array(3)].map(() => [...Array(4)].map(() => 0))
最后,一个类型安全的TypeScript util函数:
export const createMultiDimensionalArray = <T>(
n: number,
m: number,
initialVal?: T,
): T[][] => {
const matrix = [...Array(n)].map(() => [...Array(m)]);
return initialVal === undefined
? matrix
: matrix.map(r => r.map(() => initialVal));
};
使用它的例子:
const a = createMultiDimensionalArray(1, 2);
a[1][2] = 3; // Works
const b = createMultiDimensionalArray(2, 3, false);
b[1][2] = true; // Works
b[1][2] = 3; // Error: Type '3' is not assignable to type 'boolean'.
要创建一个4x6数组,只需这样做
const x = [...new Array(6)].map(elem => new Array(4))
通常从一个空数组开始是一个很好的实践,而不是填充w个随机值。(你通常在1D中将数组声明为const x =[],所以在2D中最好以w为空开始。)
Array(m).fill(v).map(() => Array(n).fill(v))
你可以创建一个二维数组m x n,初始值m, n可以是任何数字v可以是任何值字符串,数字,未定义。
一种方法是var a = [m][n]
下面的例子定义了一个名为activities的二维数组:
let activities = [
['Work', 9],
['Eat', 1],
['Commute', 2],
['Play Game', 1],
['Sleep', 7]
];
在活动数组中,第一个维度表示活动,第二个维度显示每个活动每天花费的小时数。
要在控制台中显示活动数组,可以使用console.table()方法,如下所示:
console.table(activities);
输出如下所示:
┌─────────┬─────────────┬───┐ │(index)│0│1│ ├─────────┼─────────────┼───┤ │0│’Work’│9│ │1│’Eat’│1│ │2│’Commute’│2│ │3│’Play Game’│1│ │4│’Sleep’│7│ └─────────┴─────────────┴───┘
注意,(index)列用于表示内部数组的索引。
要访问多维数组的元素,首先使用方括号访问返回内部数组的外部数组的元素;然后使用另一个方括号访问内部数组的元素。
下面的例子返回上面activity数组中第一个内部数组的第二个元素:
console.log(activities[0][1]); // 9
向JavaScript多维数组中添加元素
您可以使用数组方法,如push()和splice()来操作多维数组的元素。
例如,要在多维数组的末尾添加一个新元素,可以使用push()方法,如下所示:
activities.push(['Study',2]);
┌─────────┬─────────────┬───┐ │(index)│0│1│ ├─────────┼─────────────┼───┤ │0│’Work’│9│ │1│’Eat’│1│ │2│’Commute’│2│ │3│’Play Game’│1│ │4│’Sleep’│7│ │5│’Study’│2│ └─────────┴─────────────┴───┘
要在数组中间插入一个元素,可以使用splice()方法。下面的代码将一个元素插入到activities数组的第二个位置:
activities.splice(1, 0, ['Programming', 2]);
┌─────────┬───────────────┬───┐ │(index)│0│1│ ├─────────┼───────────────┼───┤ │0│’Work’│9│ │1│’Programming’│2│ │2│’Eat’│1│ │3│’Commute’│2│ │4│’Play Game’│1│ │5│’Sleep’│7│ │6│’Study’│2│ └─────────┴───────────────┴───┘
这个示例计算在每个活动上花费的时间的百分比,并将该百分比附加到内部数组。
activities.forEach(activity => {
let percentage = ((activity[1] / 24) * 100).toFixed();
activity[2] = percentage + '%';
});
┌─────────┬───────────────┬───┬───────┐ │(index)│0│1│2│ ├─────────┼───────────────┼───┼───────┤ │0│’Work’│9│’38%’│ │1│’Programming’│2│’8%’│ │2│’Eat’│1│’4%’│ │3│’Commute’│2│’8%’│ │4│’Play Game’│1│’4%’│ │5│’Sleep’│7│’29%’│ │6│’Study’│2│’8%’│ └─────────┴───────────────┴───┴───────┘
从JavaScript多维数组中删除元素
要从数组中删除一个元素,可以使用pop()或splice()方法。
例如,下面的语句删除了activities数组的最后一个元素:
activities.pop();
┌─────────┬───────────────┬───┬───────┐ │(index)│0│1│2│ ├─────────┼───────────────┼───┼───────┤ │0│’Work’│9│’38%’│ │1│’Programming’│2│’8%’│ │2│’Eat’│1│’4%’│ │3│’Commute’│2│’8%’│ │4│’Play Game’│1│’4%’│ │5│’Sleep’│7│’29%’│ └─────────┴───────────────┴───┴───────┘
类似地,可以使用pop()方法从多维数组的内部数组中删除元素。下面的示例从活动数组的内部数组中删除百分比元素。
activities.forEach((activity) => {
activity.pop(2);
});
┌─────────┬───────────────┬───┐ │(index)│0│1│ ├─────────┼───────────────┼───┤ │0│’Work’│9│ │1│’Programming’│2│ │2│’Eat’│1│ │3│’Commute’│2│ │4│’Play Game’│1│ │5│’Sleep’│7│ └─────────┴───────────────┴───┘
遍历JavaScript多维数组的元素
要迭代多维数组,可以使用嵌套for循环,如下例所示。
// loop the outer array
for (let i = 0; i < activities.length; i++) {
// get the size of the inner array
var innerArrayLength = activities[i].length;
// loop the inner array
for (let j = 0; j < innerArrayLength; j++) {
console.log('[' + i + ',' + j + '] = ' + activities[i][j]);
}
}
第一个循环遍历外部数组的元素,嵌套循环遍历内部数组的元素。
脚本在控制台中输出如下:
[0,0] =功 [0,1] = 9 [1,0] =吃 [1,1] = 1 [2,0] =通勤 [2,1] = 2 [3,0] =玩游戏 [3,1] = 1 [4,0] =睡眠 [4,1] = 7 [5,0] =学习 [5,1] = 2
或者你可以使用forEach()方法两次:
activities.forEach((activity) => {
activity.forEach((data) => {
console.log(data);
});
});
工作 9 吃 1 上下班 2 玩游戏 1 睡眠 7 研究 2
使用全局对象Array并用数组填充项:
let arr = new Array(5).fill([]);
或者如果已知长度的2d数组:
let arr = new Array(5).fill(new Array(2));
我的解决方案不会是最好的,但只是给出我的解决方案来创建用户定义的多维数组。
这个函数接受行和列,
function createArray(row,column) {
let arr = [];
for(var i=0; i<row; i++){
arr[i] = [Math.floor(Math.random() * (10))];
for(var j=0;j<column;j++){
arr[i][j]= [Math.floor(Math.random() * (20))];
}
}
return arr;
}
var arrVal = createArray(4, 5);
console.log(arrVal);
这将构造任何维度的数组。
function makeArrayChildren(parent, firstDimension, ...dimensions) {
for (let i = 0; i < parent.length; i++) {
parent[i] = new Array(firstDimension);
if (dimensions.length != 0) {
makeArrayChildren(parent[i], ...dimensions);
}
}
}
function makeArray(firstDimension, ...dimensions) {
if (firstDimension == undefined) {
throw Exception("Too few dimensions");
}
let topArray = new Array(firstDimension);
if (dimensions.length != 0) makeArrayChildren(topArray, ...dimensions);
return topArray;
}
这里还有另外两个我想做的函数,我可以用它作为一个完整性检查:一个用于在多维数组中所有最低级别项上执行的每个函数,一个填充方法。
Array.prototype.dimensionalFill = function (value) {
for (let i = 0; i < this.length; i++) {
const elem = this[i];
if (elem instanceof Array) {
elem.dimensionalFill(value);
} else {
this[i] = value;
}
}
};
/*Unlike forEach, this also loops over undefined values. */
Array.prototype.dimensionalForEach = function (callableFunc, thisArg) {
if (thisArg != undefined) {
return this.dimensionalForEach(callableFunc.bind(thisArg));
}
for (let i = 0; i < this.length; i++) {
const elem = this[i];
if (elem instanceof Array) {
elem.dimensionalForEach(callableFunc);
} else {
callableFunc(elem, i, this);
}
}
};
这里有一个漂亮的小检查,它使用了所有的特性。所以至少,它不可能完全错误。
let arr = makeArray(10, 10, 5, 4);
arr.dimensionalFill(2);
let sum = 0;
arr.dimensionalForEach((elem) => {
sum += elem;
});
console.log(`sum: ${sum} === ${10 * 10 * 5 * 4 * 2}`);
值得一提的是,在这一点上,创建一个全新的结构将是一个更好的实践,但这很有趣。