Javascript JS-覆盖';这';在功能上
我正在尝试扩展阵列原型:Javascript JS-覆盖';这';在功能上,javascript,object,Javascript,Object,我正在尝试扩展阵列原型: 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; }
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;
}
我不需要这样做:
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, 2, 3], [1, 2, 3], ]
看到那个空白的第三项了吗?是的-这引起了我的问题。你不能编辑
这个
,但是你可以编辑这个[i][j]
,所以用循环将你的临时数组复制到这个
。虽然你不能覆盖这个
,但是你可以肯定地将工作数组的值设置为你在函数中构建的数组。大概是这样的:
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;
}
Array.prototype.rotate=function(){
var-arr=[];
对于(var i=0;i
正如@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]
您不能将值显式分配给此。在这种情况下,它应该完成什么?避免变异,只需将返回的数组分配给一个新变量。
.pop
是如何完成的<代码>变量值=此[this.length-1];这个长度-=1;返回值代码>,或者类似的东西。除了删除最后一个值之外,它不会更改“this”数组。我认为您要查找的是一个zip
,请检查我是否这样做了,但是它留下了前一个数组的残余,诸如此类。请先用this.length=0清除它代码>那部分是我缺少的。谢谢你的帮助!这似乎可以解决这个问题。This.length=0
不过我认为它是空的。如果原始数组中的元素多于arr
,则可能会有剩余元素。@TravisJ:规范规定,索引>长度处的每个元素都应该删除。在这里的某个地方:(然而,我认为有些浏览器的情况下,这不能正常工作……但我记不清了)。@FelixKling-谢谢你的澄清
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;
}
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]