JavaScript 2维数组分配

4

我想在JavaScript中分配一个二维数组。

我希望在JavaScript中做类似于这样的事情。

typedef struct
{
   int  itemA,
   int  itemB,
   string testC
} myStruc;

myStruct MyArray [100];

如何做到这一点?
6个回答

6
var arr = []
arr[0] = { "itemA": "A", "itemB": "B", "itemC": "C" }
arr[1] = { "itemA": "A", "itemB": "B", "itemC": "C" }

我认为你正在将静态语言的构造应用于动态和不同的JavaScript世界。在JavaScript中,数组只是一种特殊类型的对象(本身就是哈希表),具有特殊的长度属性。你在上面看到的整数“索引”(例如arr [0]中的0)只是哈希表查找。特殊的长度属性被定义为最大整数键加1。在我上面的示例中,arr.length为2。但如果我进行分配:
arr[100] = { "itemA": "A", "itemB": "B", "itemC": "C" }

即使我没有对2到99之间的任何元素进行赋值,arr.length也会是101。

同样地,在Javascript中我们通常不预定义像structs这样的对象,因此匿名对象大部分可以实现你想要的效果(或者使用Ken示例中的文档化工厂函数)。

"new Array()"并不必要,简洁的"var a = [];"语法更快。:)


有趣。我曾经想过如果在js中给数组分配“越界”会发生什么。 - Herms
而 jsight 的构造实际上为每个数组元素分配一个对象,因为花括号表示一个对象。但您可以使用对象和数组样式的符号来访问属性:var itemA1 = arr[1]["itemA"]; var itemA1 = arr.1.itemA; - roenving

3
如果我理解正确,您需要动态创建一个指定长度的数组,并填充自己定义的结构体。
在js中,结构体类似于[object Object],如下所示:
// typedef struct { type prop1 , ... , type propN } myStructName; function myStructName(){}
myStructName.prototype = { 'constructor' : myStructname, 'prop1' : defaultVal1, // ... 'propN' : defaultValN };
我们可以创建一个函数来动态创建一个结构体类型,但这不是本例的情况。 现在我们只需要创建一个函数,它可以创建一个特定长度的数组,并用所有myStruct对象实例来填充它。以下是我的方法:
/* Copyrights (c) 2011 - Matteo Giordani < matteo.giordani90@gmail.com > MIT-Style License typedef struct{ int itemA , int itemB , string testC } myStruct myStruct arr[10];*/
    JS way

    function myStruct( a , b , c )
        @param  {int}       a
        @param  {int}       b
        @param  {string}    c
        @return {object}

*/

function myStruct(){ // 参数 var a = arguments[0] , b = arguments[1] , c = arguments[2];
// 检查参数a是否为整数类型 if( typeof a == "number" && (a + "").indexOf('.') == -1 ){ this['itemA'] = a; } // 检查参数b是否为整数类型 if( typeof b == "number" && (b + "").indexOf('.') == -1 ){ this['itemB'] = b; } // 检查参数c是否为字符串类型 if( typeof c == "string" /*检查字符串长度?!*/){ this['testC'] = c; } }
// myStruct原型 myStruct.prototype = { // 构造函数 'constructor' : myStruct, // itemA的默认值 'itemA' : 0, // itemB的默认值 'itemB' : 0, // testC的默认值 'testC' : '' };
/* 静态函数defaultLength([, length]) 设置/获取defaultLength值。 @param {unsigned int|void} length @return {void|unsigned int} */
myStruct.defaultLength = function(){ // 返回默认值 if( arguments.length == 0 ){ return myStruct._default; }else{ // 设置默认值 var l = arguments[0]; myStruct._default = ( typeof l == "number" && (l + "").indexOf('.') == -1 ) ? Math.abs( l ) : 0; } };
// @var {unsigned int} myStruct._default = 0 myStruct._default = 0;
/* 静态函数makeArray( length ) @param {unsigned int} length 数组的长度 @return {array} */ myStruct.makeArray = function( length ){ // 检查length是否为无符号整数 length = ( typeof length == "number" && (length + "").indexOf('.') == -1 ) ? Math.abs( length ) : myStruct.defaultLength();
// 本地数组 var array = [] , i = 0;
// 填充数组 for( ; i < length; i++){ array[ i ] = new myStruct(); }
// 返回 return array; };
// 制造它! myStruct.defaultLength(10); // 设置默认长度== 10 var arr = myStruct.makeArray(); // [myStruct, myStruct, myStruct, myStruct, myStruct, myStruct, myStruct, myStruct, myStruct, myStruct] arr.length; // 10 Object.prototype.toString.call( arr ); // [object Array]
/* 另一个例子 */ var arr2 = []; // 制造一个空数组 arr2[0] = new myStruct(1,1,'test1'); // 制造第一个myStruct对象 arr2[1] = new myStruct(2,2,'test2'); // 制造第二个myStruct对象

1

1
function Sample(value1, value2) {
    this.value1 = value1;
    this.value2 = value2;
}

var test = new Array();

test[0] = new Sample("a","aa");
test[1] = new Sample("b","bb");

PS:在 JavaScript 中,有多种方法可以实现这一点。


1
如果您真的想要为一个特定结构体分配100个元素数组,可以按照以下步骤进行:
arr = [];

for (i=0; i<100; i++) {
   arr[i] = {itemA: <value>, itemB: <value>, textC: <string>, ... };
}

0

在Javascript中创建数组有几种方法,最接近你想要做的方法应该是:

var myArray = new Array("someString1", "someString2", "someString3", ...);

您可以将"someString1"替换为实际对象。

您还可以使用Array构造函数来设置初始长度:

var myArray = new Array(5);
myArray[0] = ...;
myArray[1] = ...;

在Javascript中,数组实际上是相当灵活的 - 在访问超出数组边界的元素之前,甚至不需要定义长度。
请看 Mozilla数组文档

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接