如何创建一个多维数组?(需要代码示例)
Javascript: how to create a multi-dimensional array? (Code example needed)
我有一个10行10列的表。我想定义一个数组,我可以在其中放置一个值,例如pos5行3列。
值本身是一个包含多个条目的数组。这个数组的入口也是一个数组
的例子:
Row 1, column 1:
My text 1, Link to text 1
My text 2, Link to text 2
Row 4, column 5:
My text 3, Link to text 3
Row 6, column 2:
My text 1, Link to text 1
My text 2, Link to text 2
My text 3, Link to text 3
My text 4, Link to text 4
不是每个表项都需要定义。一个表元素条目可以有多个条目。一个条目由两个值组成。一个文本和该文本的链接。
已经定义了html-table。现在我想用上面的值(链接)填充它。
我的问题是,如何创建一个有效的数据结构,这样我就可以很容易地找到有条目的表位置(可能没有循环10行10列)。对于每个条目,我想获得文本+链接的列表。
以及如何访问/读取我定义的每个条目。(我没有问题放置值到我的html-table.)
如果有人能给我一些代码,例如如何建立这样的数据结构,我将非常感激。
var multiArray = [ ['element 0, 0', 'element 0, 1', 'element 0, 2'], ['element 1, 0', 'element 1, 1']];
等等…
编辑[]中的每一个符号都是一个数组,所以你只需要将它们组合成另一个数组
如果内存不是问题,就使用数组的数组;
var table = [];
table.length = 10; // 10 rows;
for (var i = 0; i < array.length; i++) {
table[i] = [];
table[i].length = 20; // 20 columns for each row.
}
如果表很大,但只使用了几个单元格,您也可以使用hash的hash:
var table = {};
table.rowCount = 10; // there're 10 rows
table[1] = {}
table[1].columnCount = 20 // 20 cells for row 1
table[1][3] = "hello world";
// visit all cells
for (var row in table) {
for (var column in table[row] {
console.log(table[row][column]);
}
}
你甚至可以混合散列和数组
您可以创建一个简单的包装器来方便调用:http://jsfiddle.net/QRRXG/2/.
多维数组就是数组中的另一个数组。你可以构建一个包含10个数组的数组,每个数组又有10个数组。然后用arr[i][j]
。
项可以表示为对象:
{ name: "foo", link: "bar" }
则这样的项可以像obj.name
和obj.link
一样被解析。
var multi = (function() {
var data = [];
// initialize
for(var i = 0; i < 10; i++) {
data[i] = [];
for(var j = 0; j < 10; j++) {
data[i][j] = [];
}
}
return {
get: function(i, j) { // will return an array of items
return data[i][j];
},
push: function(i, j, v) { // will add an item
data[i][j].push(v);
},
clear: function(i, j) { // will remove all items
data[i][j] = [];
},
iterateDefined: function(f) {
for(var i = 0; i < 10; i++) {
for(var j = 0; j < 10; j++) {
if(data[i][j].length > 0) {
f(data[i][j], i, j);
}
}
}
}
};
})();
你可以这样使用:
multi.push(2, 3, { name: "foo", link: "test1" });
multi.push(2, 3, { name: "bar", link: "test2" });
multi.push(1, 4, { name: "haz", link: "test3" });
multi.push(5, 7, { name: "baz", link: "test4" });
multi.clear(5, 7);
console.log(multi.get(2, 3)); // logs an array of 2 items
console.log(multi.get(1, 4)); // logs an array of 1 item
console.log(multi.get(5, 7)); // logs an array of 0 items
console.log(multi.get(2, 3)[0].name); // logs "foo"
console.log(multi.get(2, 3)[1].link); // logs "test2"
multi.iterateDefined(function(items, i, j) {
console.log(items, i, j); // will log two times
});
创建实用程序Object
:
var DataTable = {
source: [],
setEntry: function(i,j,e) {
var o ;
if( !!! ( o = this.source[i] ) ) o = this.source[i] = [] ;
o[j] = e ;
return this ;
},
getEntry: function(i,j) {
var o, e = null ;
if( !! ( o = this.source[i] ) ) e = o[j] || null ;
return e ;
}
} ;
其他答案似乎建议将虚拟Array
s作为未使用的坐标的占位符。这——虽然没有错——是不必要的:如果你在JavaScript中设置了一个索引超过当前范围的Array
条目,Array
本质上是用undefined
值填充的。
var a = [ ] ; // a length is 0
a[1024] = 1 // a length is now 1025, a[1] is undefined
然后添加您需要的值:
DataTable.setEntry( 1, 1, ["My text 1","Link to text 1","My text 2","Link to text 2"] )
.setEntry( 4, 5, ["My text 3","Link to text 3"] )
//..
;
以下控制语句将返回坐标的Array
s或null
的值(如果DataTable.source
不包含给定坐标的嵌套Array
):
console.log("(!!) d.source: " + DataTable.getEntry(4,5) ) ;
console.log("(!!) d.source: " + DataTable.getEntry(1,1) ) ;
console.log("(!!) d.source: " + DataTable.getEntry(0,0) ) ;
试试这里:
- 链接到JSFiddle
更新:
这是一个相当老的帖子,但是因为我收到了一个注释来解释这个片段,这里有一个类语法的更新和一些更多的注释:
class DataTable {
data = [];
constructor() {
// bind methods to this instance
this.setEntry = this.setEntry.bind(this);
this.getEntry = this.getEntry.bind(this);
}
// set an entry at the given coordinates (row and column index pair)
setEntry(rowIndex, columnIndex, value) {
let row = this.data[rowIndex];
// create the row lazily if it does not exist yet
if(typeof row === 'undefined') {
this.data[rowIndex] = [];
row = this.data[rowIndex];
}
// set the value
row[columnIndex] = value;
}
// get the entry at the given coordinates (row and column index pair)
getEntry(rowIndex, columnIndex) {
const row = this.data[rowIndex];
// test if the row is defined; if not return null.
if(typeof row === 'undefined') { return null; }
else {
// return the value or fall back to null
return row[columnIndex] || null;
}
}
}
const d = new DataTable();
d.setEntry(1, 1, ["My text 1","Link to text 1","My text 2","Link to text 2"]);
d.setEntry(4, 5, ["My text 3","Link to text 3"]);
console.log(`d.getEntry(4, 5) = ${d.getEntry(4, 5)}`);
console.log(`d.getEntry(1, 1) = ${d.getEntry(1, 1)}`);
console.log(`d.getEntry(0, 0) = ${d.getEntry(0, 0)}`);
- 如何将数组循环到JSON代码中
- 如果在代码末尾进行求值,jQuery-console.log将提供空数组
- JavaScript代码,用于在浏览器中显示字节数组中的PDF文件(非base64编码)
- 如何避免“;使用数组文字表示法“;以下javascript代码中的jslint错误
- 在将csv文件中的数据分配给数组变量时增强了d3代码
- 使用键/代码转换JavaScript数组
- PHP函数调用和Javascript代码中的数组传递
- 使用从forEach循环中提取的国家代码从数组中获取国家名称
- 在Javascript代码中显示PHP数组变量
- Asp.net将代码背后的数据传递给Javascript并调用数组
- 谷歌跟踪代码管理器使用什么模式来观察 de 'dataLayer' 数组
- 通过代码+敲除更新数组中的值
- 为什么此代码返回未定义的4次而不是数组值
- 嗨,我正试图将我的movieprice数组从复选框值传递给另一个计算选择总数的函数,但我的代码没有;t运行
- 用于删除数组中的零的Javascript函数代码
- php代码返回基于数组的值
- 如果我只想从数组中打印任何一个元素.任何数组.那么代码会是什么
- 如何用javascript创建三维数组我想把数据插入数组中,这有助于我的代码
- 如何将PHP数组代码转换为JSON数组
- 我的反向数组代码有什么问题