Ruby => Перевод JavaScript

Любопытно... как бы вы написали этот рубин в JS?

Array.new(3, Array.new(3, 0))

который возвращается

[[0, 0, 0], [0, 0, 0], [0, 0, 0]]

Я пробовал разные вещи, но все они кажутся грязными. Полагаю, некоторые вещи не могут быть такими же чистыми, как Руби, но как бы вы подошли к этому?

возможно я изучу трюк JS или два;)

РЕДАКТИРОВАТЬ Было обнаружено, что этот код Ruby на самом деле не создает 3 массива. Он создает 1 массив, на который ссылаются другие. Это не было намерением. Я ищу способ легко отобразить 2-мерный массив с количеством элементов X и количеством вложенных элементов Y в JS.

Также... Это надуманный пример. намерение состоит в том, чтобы иметь возможность заменить 3 любым числом. это был просто пример с использованием 3.

6 ответов

Вы можете определить это так:

var arr = [[0, 0, 0], [0, 0, 0], [0, 0, 0]];

По сути, вы явно определяете это. Однако этот массив содержит ссылки на три разных массива (всего их 4). Чтобы он вел себя как ruby, вам нужно создать функцию, которая имитирует это поведение:

function arr(size, element) {
   var ret = [];

   for(var i = 0; i < size; i++) {
       ret.push(element);
   }

   return ret;      
}

Тогда вы могли бы сделать:

var myArray = arr(3, arr(3, 0)); //myArray contains [[0, 0, 0], [0, 0, 0], [0, 0, 0]]

Это в большей степени относится к поведению, которое вы видите в ruby, поскольку каждый элемент в массиве является ссылкой на один и тот же массив (всего всего два массива). Вы можете проверить это, выполнив myArray[0][1] = 2; а затем проверять myArray, Вы должны увидеть второй элемент в каждом из массивов в myArray установить на 2.

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

var a = [[,,],[,,],[,,]]

a[1][1] = 'foo'
alert(a[1][1]) //foo

Ниже приведен правильный синтаксис Javascript, при условии, что вы хотите создать 4 массива:

[[0, 0, 0], [0, 0, 0], [0, 0, 0]]

РЕДАКТИРОВАТЬ:

На самом деле ваш код ruby ​​создает только ДВА массива. Один массив [0,0,0] а другой массив содержит три ссылки на этот массив. Если вы измените array[0][2] ты тоже меняешь array[1][2], Вы уверены, что это то, что вы хотите? Эквивалентный код JavaScript был бы:

var b = [0, 0, 0];
var a = [b, b, b];

В Ruby вы можете получить желаемый эффект, как этот

a = Array.new(3) { Array.new(3, 0) }
p a #[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
a[0][0] = 1
p a #[[1, 0, 0], [0, 0, 0], [0, 0, 0]]

В JS вот так

var multi_dim = function(a, b, value) {
  var myObj = [];
  for (i=0;i<a;i++) {
    myObj[i] = [];
    for (j=0;j<b;j++) {
      myObj[i][j] = value;
    }
  }
  return myObj;
};

var c = multi_dim(3,3,0);
WScript.echo(c); //0,0,0,0,0,0,0,0,0
c[0][0]=1
WScript.echo(c); //1,0,0,0,0,0,0,0,0

замените WScript.echo на document.write, если не в Windows и / или в браузере

Я думаю, вы могли бы просто сделать это: http://jsfiddle.net/PZBUr/

var i = "[0, 0, 0]";
var myArray = new Array(i, new Array(i, new Array(i)));
document.write(myArray);
​

Еще один способ сделать это:

var arr = new Array(
    new Array(0, 0, 0),
    new Array(0, 0, 0),
    new Array(0, 0, 0)
);

или просто

var arr = [
    [0, 0, 0],
    [0, 0, 0],
    [0, 0, 0]
]
Другие вопросы по тегам