6

很好奇……你会如何用 JS 编写这个 Ruby?

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

返回

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

我尝试了各种各样的东西,但它们看起来都很乱。我想有些东西不能像 Ruby 那样干净,但是你会怎么处理呢?

也许我会学习一两个 JS 技巧;)

编辑 据透露,这段 Ruby 代码实际上并没有创建 3 个数组。它创建 1 个数组,其他人引用。这不是本意。我正在寻找一种方法来轻松映射二维数组,其中包含 X 数量的元素和 Y 数量的 JS 中的嵌套元素。

另外......这是一个人为的例子。意图是能够用任何数字代替 3。这只是使用 3 的示例。

4

6 回答 6

4

您可以像这样定义它:

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。您应该看到设置为 2 的每个数组中的第二个元素myArray

于 2012-07-08T02:29:19.940 回答
2

如果您只想要一个空数组容器,只是为了跟踪长度或稍后分配值,您可以这样做,有点hacky但应该可以:

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

a[1][1] = 'foo'
alert(a[1][1]) //foo
于 2012-07-08T02:26:35.587 回答
2

以下是有效的 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];
于 2012-07-08T02:28:17.460 回答
1

在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

如果不在 Windows 和/或浏览器中,则用 document.write 替换 WScript.echo

于 2012-07-08T15:17:16.877 回答
0

我想你可以这样做:http: //jsfiddle.net/PZBUr/

var i = "[0, 0, 0]";
var myArray = new Array(i, new Array(i, new Array(i)));
document.write(myArray);
​
于 2012-07-08T02:32:36.660 回答
0

另一种方法是:

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]
]
于 2012-07-08T02:34:58.337 回答