Javascript:如何创建多维数组?(需要代码示例)
我有一个10行10列的表格。我想定义一个数组,在该数组中,我可以在第5行第3列的位置处放置一个值 值本身是一个包含更多条目的数组。这个数组的条目也是一个数组 例如:Javascript:如何创建多维数组?(需要代码示例),javascript,arrays,data-structures,multidimensional-array,Javascript,Arrays,Data Structures,Multidimensional Array,我有一个10行10列的表格。我想定义一个数组,在该数组中,我可以在第5行第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
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表已经定义。现在我想用上面的值(链接)填充它
我的问题是,如何创建一个高效的数据结构,这样我就可以轻松地找到包含条目的表位置(可能不需要循环10行10列)。对于每个条目,我想得到文本+链接的列表
以及如何访问/读取我定义中的每个条目。(将该值放入html表中没有问题。)
如果有人能给我一些代码示例,告诉我如何设置这样的数据结构,我将不胜感激。如果内存不是问题,请使用数组数组
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.
}
您甚至可以混合使用散列和数组
var multiArray = [ ['element 0, 0', 'element 0, 1', 'element 0, 2'], ['element 1, 0', 'element 1, 1']];
等等
编辑
[]中的每个符号都是一个数组,因此您只需将它们组合到另一个数组中即可您可以创建一个简单的包装器以方便调用: 多维数组只是另一个数组中的数组。因此,您可以构建一个包含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);
}
}
}
}
};
})();
创建实用工具
对象
:
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中的数组
上设置了一个索引超过当前范围的条目,则数组
基本上用未定义的
值填充
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"] )
//..
;
以下控制语句将返回坐标的数组
s或null
(如果DataTable.source
不包含给定坐标的嵌套数组
):
请在此处尝试:
更新: 这是一篇相当老的帖子,但由于我收到了一条解释该代码段的注释,下面是一篇关于类语法的更新和一些其他注释:
类数据表{
数据=[];
构造函数(){
//将方法绑定到此实例
this.setEntry=this.setEntry.bind(this);
this.getEntry=this.getEntry.bind(this);
}
//在给定坐标处设置一个条目(行和列索引对)
setEntry(行索引、列索引、值){
设row=this.data[rowIndex];
//如果行尚不存在,则延迟创建该行
如果(行的类型==='undefined'){
此.data[rowIndex]=[];
row=this.data[rowIndex];
}
//设置值
行[列索引]=值;
}
//获取给定坐标处的条目(行和列索引对)
getEntry(行索引、列索引){
const row=this.data[rowIndex];
//测试行是否已定义;如果未定义,则返回null。
if(typeof row==='undefined'){return null;}
否则{
//返回值或返回null
返回行[列索引]| | null;
}
}
}
const d=新数据表();
d、 setEntry(1,1,[“我的文本1”,“链接到文本1”,“我的文本2”,“链接到文本2”]);
d、 setEntry(4,5,[“我的文本3”,“链接到文本3”);
log(`d.getEntry(4,5)=${d.getEntry(4,5)}`);
log(`d.getEntry(1,1)=${d.getEntry(1,1)}`);
log(`d.getEntry(0,0)=${d.getEntry(0,0)}`)代码>JS中所有列的长度都相同并不重要,我喜欢itAm,我知道使用这种表示法,我必须定义每个表行+列,即使我不需要某个字段?@Enkidu你说的“即使我不需要某个字段”是什么意思?你的第二个例子是我已经在试验过的。我没有问题附加一个简单的字符串,例如“table[1][3]=“hello world”;”。但是我在附加数组时遇到了问题。我尝试使用表[1][3]=新数组(新数组('text1','link1')、新数组('text2','link2'));但我不知道如何获取这些值。。。顺便说一句,除了“newarray()”,我还可以写[a,b]?这看起来真的很聪明!:)但我的问题是,我不想访问表中的某个字段,只想获取定义的字段的值。(100个有价值的人中可能只有20个)太棒了!Tnx!似乎正是我想要的!:)Tnx。我以前从未使用过这种编码。但它似乎正是我在寻找的,正是我在寻找的。有点难理解,如果可能的话,请您解释一下这部分的setEntry和getEntry@Dileephell我使用类语法添加了一个更新,并添加了一些注释。
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"] )
//..
;
console.log("(!!) d.source: " + DataTable.getEntry(4,5) ) ;
console.log("(!!) d.source: " + DataTable.getEntry(1,1) ) ;
console.log("(!!) d.source: " + DataTable.getEntry(0,0) ) ;