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]
]