Ruby=>;Javascript翻译
好奇。。。你会如何用JS编写这个RubyRuby=>;Javascript翻译,javascript,ruby,deep-copy,Javascript,Ruby,Deep Copy,好奇。。。你会如何用JS编写这个Ruby Array.new(3, Array.new(3, 0)) 返回 [[0, 0, 0], [0, 0, 0], [0, 0, 0]] 我试过各种各样的东西,但它们看起来都很乱。我想有些东西不可能像Ruby那么干净,但是你会怎么做呢 也许我会学一两个JS技巧;) 编辑 据透露,这段Ruby代码实际上并没有创建3个数组。它创建一个数组,其他数组引用该数组。这并非本意。我正在寻找一种在JS中轻松映射包含X个元素和Y个嵌套元素的二维数组的方法 还有。。。这是
Array.new(3, Array.new(3, 0))
返回
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
我试过各种各样的东西,但它们看起来都很乱。我想有些东西不可能像Ruby那么干净,但是你会怎么做呢
也许我会学一两个JS技巧;)
编辑
据透露,这段Ruby代码实际上并没有创建3个数组。它创建一个数组,其他数组引用该数组。这并非本意。我正在寻找一种在JS中轻松映射包含X个元素和Y个嵌套元素的二维数组的方法
还有。。。这是一个人为的例子。其目的是能够用任何数字代替3。这只是一个使用3的示例。如果您只是想要一个空的数组容器,只是为了跟踪长度,或者以后分配值,您可以这样做,有点老套,但应该可以:
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]
,另一个数组包含对该数组的三个引用。如果更改数组[0][2]
也会更改数组[1][2]
。你确定这就是你想要的吗?等效的javascript代码为:
var b = [0, 0, 0];
var a = [b, b, b];
您可以这样定义它:
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;
}
这更符合您在ruby中看到的行为,因为数组中的每个元素都是对同一数组的引用(总共只有两个数组)。您可以通过执行
myArray[0][1]=2来验证这一点编码>然后检查myArray
。您应该可以看到myArray
中每个数组中的第二个元素设置为2。我想您可以这样做:
另一种方法是:
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]
]
在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]]
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
在JS中是这样的
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]]
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
var multi_dim=函数(a、b、值){
var myObj=[];
for(i=0;我即将发布此内容。如果压缩[[0,0,0],[0,0,0],[0,0,0]]
的字符数与ruby版本差不多。哦,我喜欢你的编辑+1,但你必须设置b=“[0,0,0]”约翰,我不知道你为什么想把b
变成一个字符串。OP没有提到字符串。我只是加了分号。啊!我没有意识到这一点。这不是我的本意。但这会创建嵌套数组,每个数组的第一个元素都是字符串。同意,你必须使用evil()
或主要是找到其他解决方案