【问题标题】:Ruby => Javascript translationRuby => Javascript 翻译
【发布时间】:2012-07-07 23:22:11
【问题描述】:

好奇...你会如何用 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 的示例。

【问题讨论】:

    标签: javascript ruby deep-copy


    【解决方案1】:

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

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

    【讨论】:

      【解决方案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];
      

      【讨论】:

      • 正要发布这个。如果压缩 [[0,0,0],[0,0,0],[0,0,0]] 的字符数与 ruby​​ 版本大致相同。
      • 哦,我喜欢您的编辑 +1,但您必须设置 b = "[0, 0, 0]";
      • 约翰,我不知道你为什么想让b 成为一个字符串。 OP 对字符串只字未提。我确实只是添加了分号。
      • 啊!我没有意识到这一点。那不是我的本意。
      【解决方案3】:

      你可以这样定义:

      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​​ 中看到的行为,因为数组中的每个元素都是对 same 数组的引用(总共只有 两个 数组) .您可以通过执行myArray[0][1] = 2; 然后检查myArray 来验证这一点。您应该会看到 myArray 中每个数组中的第二个元素设置为 2。

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 但这会创建嵌套数组,每个数组的第一个元素都是 string
        • 同意,您必须使用evil() 或主要寻找其他解决方案
        【解决方案5】:

        另一种方法是:

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

        【讨论】:

          【解决方案6】:

          在 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 和/或浏览器中,请将 WScript.echo 替换为 document.write

          【讨论】:

            猜你喜欢
            • 2010-10-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-11-29
            • 2022-01-17
            相关资源
            最近更新 更多