【问题标题】:Javascript References ArrayJavascript 引用数组
【发布时间】:2010-09-25 13:15:13
【问题描述】:

我有一个包含对象引用的大型多维数组,我需要能够将引用从数组中的一个位置移动到另一个位置,然后删除原始引用(或将其设置为未定义)。这样做的问题是它会删除最近的引用。

var data = [[new Obj, new Obj], [new Obj, new Obj]];

function move(fromx, fromy, tox, toy) {
   data[tox][toy] = data[fromx][fromy];
   delete data[fromx][fromy];
}

编辑:我的意思是两者都消失了。 data[tox][toy] === 未定义;两个引用都被销毁了,而不仅仅是data[fromx][fromy]

【问题讨论】:

    标签: javascript reference


    【解决方案1】:

    是的,这只是 delete 操作符在做它应该做的事情,即删除在 [fromx,fromy] 处引用的对象。尝试简单地将data[fromx][fromy] 设置为null 或未定义的变量,例如allYourBaseBelongToUs(至少我希望它是未定义的),或者如果您很无聊,undefined 也是未定义的。

    来源:

    1. https://developer.mozilla.org/en/JavaScript/Reference/Operators/Special_Operators/delete_Operator
    2. http://www.openjs.com/articles/delete.php

    【讨论】:

    • 或者,你知道...undefined。 ;-)
    • 我发现使用流行/代码文化引用作为未定义的变量更有趣。
    【解决方案2】:
    var x = [[{'a':'1'}, {'b':'1'}], [{'c':'1'}, {'d':'1'}]]
    x[1][0] = x[0][0]
    x[1][1] = x[0][1]
    delete x[0][0]
    delete x[0][1]
    
    console.log(x)
    

    打印[[undefined, undefined], [Object { a="1"}, Object { b="1"}]]

    你的预期输出是什么?

    【讨论】:

      【解决方案3】:

      delete 不会删除对象,它会删除引用该对象的属性。在您的 move 函数中,由于您刚刚将该对象分配给另一个属性,因此您仍然拥有该对象。 (不过,数组中该插槽中的任何内容都是 toast。)

      您上面的示例大部分都有效,这是一个示例(使用自定义对象,因此我们可以轻松打印出数组的内容):

      function T(id) {
        this.id = id;
      }
      T.prototype.toString = function() {
        return this.id;
      };
      
      var data = [[new T("0x0"), new T("0x1")],
                  [new T("1x0"), new T("1x1")]];
      
      display("0: " + data[0].join(","));
      display("1: " + data[1].join(","));
      
      display("Moving 0x0 to 1x2");
      move(0, 0, 1, 2);
      
      display("0: " + data[0].join(","));
      display("1: " + data[1].join(","));
      
      function move(fromx, fromy, tox, toy) {
         data[tox][toy] = data[fromx][fromy];
         delete data[fromx][fromy];
      }
      
      function display(msg) {
        var p = document.createElement('p');
        p.innerHTML = msg;
        document.body.appendChild(p);
      }
      

      Live copy

      不过,在这种情况下,我不会推荐 delete,因为这不太可能是您真正想要的。如果您想保留“单元格”但删除其内容,只需将 undefined 分配给它。 delete 实际上删除了它。

      有点跑题了,但是:JavaScript 没有多维数组。你有一个数组数组。这是一个实际上有区别的区别,因为最外面的数组持有的数组可以有不同的长度。 (此外,JavaScript 数组是稀疏的——它们根本不是真正的数组,除非实现选择使它们如此——所以数组可以具有相同的长度但有间隙。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-29
        • 2019-07-14
        • 2013-03-04
        相关资源
        最近更新 更多