我正在尝试扩展Array原型:
Array.prototype.rotate = function() {
var arr = [];
for (var i = 0; i < this[0].length; ++i) {
arr[i] = [];
for (var j = 0; j < this.length; ++j) {
arr[i].push(this[j][i])
}
}
this = arr;
return arr;
}
完全花花公子,直到this = arr
。那爆炸了。
如何重新分配原型功能的this
属性?我希望地狱能够处理以前的阵列配置。
为什么我这样做?我希望它的行为与其他数组函数一样。例如,这有效:
myArray.pop();
我不需要这样做:
myArray = myArray.pop();
我这样做是为了解决它,但它似乎很愚蠢:
Array.prototype.rotate = function()
{
var arr = [];
var len = this[0].length;
for (var i = 0; i < len; ++i) {
arr[i] = [];
for (var j = 0; j < this.length; ++j) {
arr[i].push(this[j][i])
}
}
for (var i = 0; i < this.length; ++i) {
delete this[i];
}
for (var i = 0; i < arr.length; ++i) {
this[i] = arr[i];
}
return arr;
}
这可行,但是,在一个例子中,当旋转这个数组时:
[[1, 1], [2, 2], [3, 3]]
我会得到:
[[1, 2, 3], [1, 2, 3], ]
看到那个空白的第三项?是的 - 这给我带来了麻烦。
答案 0 :(得分:9)
虽然您无法覆盖this
,但您肯定可以将工作数组的值设置为您在函数中构建的数组。像这样:
Array.prototype.rotate = function() {
var arr = [];
for (var i = 0; i < this[0].length; ++i) {
arr[i] = [];
for (var j = 0; j < this.length; ++j) {
arr[i].push(this[j][i])
}
}
this.length = 0; //empty the array
this.push.apply(this, arr); //push all of the elements from arr onto this
return arr;
}
答案 1 :(得分:0)
您无法修改this
,但可以修改this[i][j]
,因此请将临时数组复制到this
并循环播放。
答案 2 :(得分:0)
正如@Meredith所说,如果你修改它而不是新数组,你将得到你期望的结果。以下测试对我有用:
Array.prototype.rotate = function(){
var a = this[0];
this[0] = this[1];
this[1] = a;
};
var test = [1,2];
test.rotate();
console.log(test); // [2,1]