Javascript:如何创建多维数组?(需要代码示例)
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/8456233/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Javascript: how to create a multi-dimensional array? (Code example needed)
提问by Enkidu
I have a table 10 rows, 10 columns. I want to define an array where I can place a value at e.g. pos. row 5, column 3.
我有一个 10 行 10 列的表格。我想定义一个数组,我可以在其中放置一个值,例如 pos。第 5 行,第 3 列。
The value itself is an array with more entries. And the entry of this array is also an array.
该值本身是一个包含更多条目的数组。而这个数组的入口也是一个数组。
Example:
例子:
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
Not every table entry needs to be defined. A table element entry can have multiple entries. An entry consists of two values. A text and the link for the text.
并非每个表条目都需要定义。一个表元素条目可以有多个条目。一个条目由两个值组成。一个文本和文本的链接。
The html-table is already defined. Now I want to fill it with the values (links) above.
html-table 已经定义。现在我想用上面的值(链接)填充它。
My problem is, how to create an efficient data structure so that I easily can find table-positions that have entries (maybe without looping 10 rows 10 columns). For each entry I want to get the list of texts + links.
我的问题是,如何创建一个有效的数据结构,以便我可以轻松地找到具有条目的表位置(也许不需要循环 10 行 10 列)。对于每个条目,我想获取文本 + 链接列表。
And how to access/read each entry of my definition. (I have no problem placing the value to my html-table.)
以及如何访问/阅读我定义的每个条目。(我可以将值放置到我的 html 表中。)
I'd really appreciate if someone could give me some code-example how to set up such a data structure.
如果有人能给我一些如何设置这样一个数据结构的代码示例,我将不胜感激。
回答by haynar
var multiArray = [ ['element 0, 0', 'element 0, 1', 'element 0, 2'], ['element 1, 0', 'element 1, 1']];
and so on...
等等...
EDITevery single notation in [] is an array, so you just have to combine them into an another array
编辑[] 中的每个符号都是一个数组,因此您只需要将它们组合成另一个数组
回答by pimvdb
You could create a simple wrapper to make calling convenient: http://jsfiddle.net/QRRXG/2/.
您可以创建一个简单的包装器来方便调用:http: //jsfiddle.net/QRRXG/2/。
A multidimensional array is just an array in another. So you can build an array with 10 arrays which in turn have 10 arrays in each. Then get one with arr[i][j]
.
多维数组只是另一个数组中的数组。因此,您可以构建一个包含 10 个数组的数组,而每个数组又包含 10 个数组。然后得到一个arr[i][j]
。
Items can be represented as an object:
项目可以表示为一个对象:
{ name: "foo", link: "bar" }
then such an item can be parsed like obj.name
and obj.link
.
那么这样的项目可以像obj.name
and一样被解析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);
}
}
}
}
};
})();
You can the use it like:
你可以像这样使用它:
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
});
回答by FK82
Create a utility Object
:
创建一个实用程序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 ;
}
} ;
The other answers seem to suggest placing dummy Array
s as placeholders for coordinates that are unused. This -- while it is not wrong -- is unnecessary: if you set an entry on an Array
in JavaScript whose index exceeds the current range the Array
is essentially padded with undefined
values.
其他答案似乎建议将 dummy Array
s 作为未使用坐标的占位符。这 - 虽然没有错 - 是不必要的:如果您Array
在 JavaScript 中设置一个条目,其索引超过当前范围,Array
则基本上用undefined
值填充。
var a = [ ] ; // a length is 0
a[1024] = 1 // a length is now 1025, a[1] is undefined
Then add the values you require:
然后添加您需要的值:
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"] )
//..
;
The following control statements will return the value of the Array
s of the coordinates or null
(if DataTable.source
does not contain a nested Array
for the given coordinates):
以下控制语句将返回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) ) ;
Try it here:
在这里试试:
UPDATE:
更新:
This is a pretty old post, but since I received a comment to explain the snippet, here's an update with class syntax and a few more comments:
这是一篇很老的帖子,但由于我收到了解释该代码段的评论,这里是类语法的更新和更多评论:
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)}`);
回答by Jeffrey Zhao
Just use an array of array if the memory is not the problem;
如果内存不是问题,只需使用数组数组;
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.
}
If the table is big but only a few cells are used, you can also use a hash of hash:
如果表很大但只使用了几个单元格,你也可以使用 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]);
}
}
You can even mix hash and array.
您甚至可以混合使用哈希和数组。