Java Script 2 D Распределение массивов - PullRequest
4 голосов
/ 06 октября 2008

Я хочу выделить 2 D массив в Java Script.

Я хочу сделать что-то подобное в JavaScript

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

myStruct MyArray [100];

Как это сделать?

Ответы [ 6 ]

6 голосов
/ 06 октября 2008
var arr = []
arr[0] = { "itemA": "A", "itemB": "B", "itemC": "C" }
arr[1] = { "itemA": "A", "itemB": "B", "itemC": "C" }

Я думаю, что вы пытаетесь применить статические языковые конструкции к динамическому и другому миру Javascript. В Javascript на самом деле нет понятия «массивы» в том смысле, как это делают многие языки.

В Javascript массив - это просто особый вид объекта (сам по себе просто хеш), который имеет специальное свойство длины. Целочисленные «индексы», которые вы видите выше (т. Е. 0 в arr [0]), просто имеют поиск. Специальное свойство длины определено на единицу больше, чем ключ наибольшего целого числа. В моем примере выше, arr.length равен 2. Но если бы я назначил:

arr[100] = { "itemA": "A", "itemB": "B", "itemC": "C" }

Тогда arr.length будет 101, хотя я ничего не сделал, чтобы присвоить любому из элементов от 2 до 99.

Точно так же мы обычно не предопределяем объекты, такие как структуры, в Javascript, и, таким образом, анонимные объекты будут в значительной степени выполнять то, что вы хотите (или использовать задокументированную фабричную функцию, как в примере от Кена).

"new Array ()" не является обязательным, поскольку сжато "var a = [];" Синтаксис быстрее. :)

3 голосов
/ 26 июня 2011

Если я понимаю, вам нужно динамически создать массив заданной длины, заполненный вашей собственной структурой.

В js структура - это [объектный объект], подобный

    // 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];</p>

<pre><code>    JS way

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

* / function myStruct () {

// arguments var a = arguments[0] , b = arguments[1] , c = arguments[2]; // check INT type for argument a if( typeof a == "number" && (a + "").indexOf('.') == -1 ){ this['itemA'] = a; } // check INT type for argument b if( typeof b == "number" && (b + "").indexOf('.') == -1 ){ this['itemB'] = b; } // check INT type for argument b if( typeof c == "string" /*check for string length?!*/){ this['testC'] = c; } } // myStruct prototype myStruct.prototype = { // constructor 'constructor' : myStruct, // default value for itemA 'itemA' : 0, // default value for itemB 'itemB' : 0, // default value for testC 'testC' : '' }; /* static function defaultLength([, length]) Set/Get the defaultLength value. @param {unsigned int|void} length @return {void|unsigned int} */ myStruct.defaultLength = function(){ // return the default value if( arguments.length == 0 ){ return myStruct._default; }else{ // set the default value 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; /* static function makeArray( length ) @param {unsigned int} length the length of the array @return {array} */ myStruct.makeArray = function( length ){ // Check if length is unsigned int length = ( typeof length == "number" && (length + "").indexOf('.') == -1 ) ? Math.abs( length ) : myStruct.defaultLength(); // local array var array = [] , i = 0; // populate the array for( ; i < length; i++){ array[ i ] = new myStruct(); } // return return array; }; // MAKE IT! myStruct.defaultLength(10); // set the default length == 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] /* ANOTHER EXAMPLE */ var arr2 = []; // make an empty array arr2[0] = new myStruct(1,1,'test1'); // make a first myStruct object arr2[1] = new myStruct(2,2,'test2'); // make a second myStruct object
1 голос
/ 07 октября 2008

Если вы действительно хотите выделить 100 элементов массива определенной структуры, вы можете сделать следующее:

arr = [];

for (i=0; i<100; i++) {
   arr[i] = {itemA: <value>, itemB: <value>, textC: <string>, ... };
}
1 голос
/ 06 октября 2008
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: Есть несколько способов сделать это в Java Script.

1 голос
/ 06 октября 2008

Похоже, вы хотите свойства для массива объектов, но я могу неправильно истолковать.

Возможно, вам просто нужно что-то вроде ...

function Person(first, last) {
    this.first = first;
    this.last = last;
}

var person = new Person("John", "Dough");

http://www.kevlindev.com/tutorials/javascript/inheritance/index.htm

0 голосов
/ 06 октября 2008

Есть несколько способов создания массивов в Javascript, метод, ближайший к тому, что вы хотите сделать, должен быть:

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

Вы можете заменить "someString1" на реальные объекты.

Вы также можете использовать конструктор Array для установки начальной длины:

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

Массивы в Javascript на самом деле довольно свободные - вам даже не нужно определять длину, прежде чем вы получите доступ к элементу, который обычно находится за пределами массива.

Взгляните на документацию Mozilla по массивам .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...