Reputation: 20770
I am trying to extend the Array prototype:
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;
}
Totally dandy, until this = arr
. That bombs out.
How do I re-assign the this
property of a prototypal function? I want the hells to do with the previous array configuration.
Why am I doing it this way? I want it to behave like other array functions. For example, this works:
myArray.pop();
I don't need to do this:
myArray = myArray.pop();
I did this to solve it, but it seems stupid:
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;
}
This would work, but, in an example, when rotating this array:
[[1, 1], [2, 2], [3, 3]]
I would get:
[[1, 2, 3], [1, 2, 3], ]
See that little blank third item? Yeah - that caused me problems.
Upvotes: 5
Views: 2986
Reputation: 4654
As @Meredith said, if you modify this instead of a new array, you'll have the result you expect. the following test worked for me :
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]
Upvotes: 0
Reputation: 5607
Although you cannot overwrite this
, you can most certainly set the value of the working array to the array you've built out in your function. Something like 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;
}
Upvotes: 9
Reputation: 840
You can't edit this
, but you can edit this[i][j]
, so copy your temporary array into this
with a loop.
Upvotes: 0