如果我有以下代码,则清空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: []
答案 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)
我尝试了不同的东西。也许它很脏,但存储本身就在物体上。
//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']
当你这样做时:
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);