清除并撤消清除数组

时间:2014-08-06 06:29:58

标签: javascript

如果我有以下代码,则清空arry:

var a1 = [1,2,3];
a1 = [];
//returns []

但是我试图创建一个清除和撤消清除数组的功能,它没有按预期工作:

var foo = ['f','o','o'];
var storeArray;
function clearArray(a){
   storeArray = a;
   a = [];
}
function undoClearArray(a){
   a = storeArray;
}

clearArray(foo);
foo; //still returns ['f','o','o'] 

//but expected result is: []

9 个答案:

答案 0 :(得分:3)

问题在于:

您将数组分配给变量foo.

然后将此对象传递给您将其存储在另一个变量a中的函数。现在你有一个两个变量指向的对象。在该函数中,然后将a重新分配给另一个空数组[]。现在a指向空对象,foo仍然指向原始对象。你没有通过重新分配a来改变foo。

这里有一个简洁的方式来存储你的阵列:

var storeArray = [];
function clearArray(a){
    while (a.length>0){ 
        storeArray.push(a.shift()) //now a is empty and storeArray has a copy
        }
}

答案 1 :(得分:1)

我尝试了不同的东西。也许它很脏,但存储本身就在物体上。

fiddle

//define the object to hold the old data
Object.defineProperty(Array.prototype, "storage", {
    enumerable: false,
    configureable: true,
    get: function () {
        return bValue;
    },
    set: function (newValue) {
        bValue = newValue;
    }
});

//define the prototype function clear to clear the data
Object.defineProperty(Array.prototype, "clear", {
    enumerable: false,
    writable: false,
    value: function () {
        this.storage = this.slice(0);         //copy the data to the storage
        for (var p in this) {
           if (this.hasOwnProperty(p)) {
                delete this[p];               //delete the data
           }
        }
        return this;  //return the object if you want assign the return value
    }
});

//define the prototype function restore to reload the data
Object.defineProperty(Array.prototype, "restore", {
    enumerable: false,
    writable: false,
    value: function () {
       var a = this.storage.slice(0);       //copy the storage to a local var
        for (var p in this.storage) {
            if (this.storage.hasOwnProperty(p)) {
                this[p] = a[p];              //assign the pointer to the new variable
                delete this.storage[p];      //delete the storage            
            }
        }
        return this;
    }
});

var a = ['f','o','o'];
console.log(a); //--> displays ['f','o','o']

a.clear();
console.log(a); //--> displays []

a.restore();
console.log(a); //--> displays ['f','o','o']

答案 2 :(得分:0)

function clearArray(a){
   storeArray = a.slice(0);
   return a.length = 0;
}

或设置foo.length = 0;

答案 3 :(得分:0)

您可以使用splice()方法删除数组中的所有元素,如下面的

function clearArray(a){
   storeArray = a;
   a.splice(0,a.length);
}

答案 4 :(得分:0)

var a = [1,2,3,4];
var tempArr ;

clearArray = function() {
    tempArr = a.slice(0);
    a.length = 0;
}

undoArray = function() {
    a = tempArr.slice(0);
}

这是一个小jsfiddle:http://jsfiddle.net/66s2N/

答案 5 :(得分:0)

以下是您想要实现的目标:

var foo = ['f','o','o'];
var storeArray;
function clearArray(a){
   storeArray = a.slice(0);
   for (var i=0; i<a.length; i++)
      delete a[i];

   a.length = 0;
}
function undoClearArray(a){
   for (var i=0; i<storeArray.length; i++)
       a.push(storeArray[i]);
}

console.log(foo);

clearArray(foo);
console.log(foo); //now foo is []

undoClearArray(foo);
console.log(foo); // now foo is ['f','o','o']

http://jsfiddle.net/44EF5/1/

当你这样做时:

var a1 = [1,2,3]; a1 = [];

就像你写的那样:

var a1 = [1,2,3]; var a1 = [];

你正在覆盖变量。

现在,为什么你的方法不起作用 - 在JS中没有通过引用传递。 MarkM响应解释了函数内发生的事情。

现在,为什么上面的工作 - 虽然你有两个指向同一个数组的变量,没有什么能阻止你修改那个数组。因此storeArray = a.slice(0)将创建数组的副本。然后使用delete我们删除数组的所有值,然后length不可枚举(因此使用for (var i in a)无效)我们重新分配数组的长度。这已删除原始数组的值,同时创建分配给storeArray的新数组。

答案 6 :(得分:0)

只需使用以下功能更新您的两个功能

function clearArray(a){
   storeArray = a.slice(0);
   a.length = 0;
}
function undoClearArray(a){
  a = storeArray;
  return a;
}

undoClearAray()中我们返回具有新引用的变量(在clearArray()中,原始数组和新数组都引用相同的对象。如果引用的对象发生更改,则更改对于新的和原始的数组)。因此,对于旧值,请将其用作foo=undoClearArray(foo);

答案 7 :(得分:0)

var foo = ['f','o','o'];
var storeArray;
function clearArray(a){
   storeArray = a;
   a = [];
   return a;
}
function undoClearArray(a){
   a = storeArray;
}

foo = clearArray(foo);
foo; //returns [] 

答案 8 :(得分:0)

你可以使用包装器来做到这一点。首先使用定义的其他方法创建包装函数,然后使用该函数而不是[]创建数组。以下是一个示例(请参阅JSFiddle):

var extendedArray = function() {
    var arr = [];
    arr.push.apply(arr, arguments);

    arr.clearArray = function() {
        this.oldValue = this.slice(0);
        this.length = 0;
    }

    arr.undoArray = function() {
        this.length = 0;
        for (var i = 0; i < this.oldValue.length; i++) {
            this.push(this.oldValue[i]);
        }
    }
    return arr;
};

var a = extendedArray('f', 'o', 'o');

alert(a);
a.clearArray();
alert(a);
a.undoArray();
alert(a);