0
Array.prototype.move = function(oldIndex, newIndex) {
    var val = this.splice(oldIndex, 1);
    this.splice(newIndex, 0, val[0]);
}

//Testing - Change array position
var testarray = [1, 2, 3, 4];
testarray.move(3, 0);
console.log(testarray);

这会产生错误“this.splice is not a function”,但它会返回所需的结果。为什么?

4

3 回答 3

1
Array.prototype.move = function(oldIndex, newIndex) {
    if(Object.prototype.toString.call(this) === '[object Array]') {
        if(oldIndex && typeof oldIndex == 'number' && newIndex && typeof newIndex == 'number') {
            if(newIndex > this.length) newIndex = this.length;
            this.splice(newIndex, 0, this.splice(oldIndex, 1)[0]);
        }
    }
};

出于某种原因,该函数被加载时的文档调用(仍然没有完全弄清楚)。我添加了一些检查来验证 this = 一个数组,然后如果提供的 int 大于总长度,则还将新索引重置为等于总大小。这解决了我遇到的错误问题,对我来说是在数组中移动对象的最简单方法。至于为什么调用onload函数一定是和我的代码有关。

于 2012-06-07T03:52:11.123 回答
0

您不需要占位符变量-

Array.prototype.move = function(oldIndex, newIndex) {
       this.splice(newIndex, 0, this.splice(oldIndex, 1)[0]);
}
var a=[1,2,3,4,9,5,6,7,8];
a.move(4,8);

a[8]
/*  returned value: (Number)
9
*/
于 2012-06-07T00:18:00.937 回答
0

如果您的代码必须在任意环境中工作,那么向内置对象添加属性并不是一个好主意。如果您确实扩展了此类对象,则不应使用其他人可能会使用的属性名称来做相同或类似的事情。

似乎有不止一种方法可以“移动”一个成员,你似乎在做的事情可以更好地命名为“交换”,所以:

if (!Array.prototype.swap) {
  Array.prototype.swap = function(a, b) {
    var t = this[a];
    this[a] = this[b];
    this[b] = t; 
  }
}

我希望简单地重新分配值比调用需要创建新数组并多次修改旧数组的方法更有效。但无论如何,这可能没有实际意义。上面的内容当然更容易阅读,并且输入的字符更少。

另请注意,以上是稳定的,array.swap(4,8)给出与 相同的结果array.swap(8,4)

如果你想创建一个健壮的函数,你首先需要弄清楚在任何一个索引大于 array.length 或者一个不存在的情况下该怎么做,等等。例如

var a = [,,2]; // a has length 3
a.swap(0,2);

在上面,没有成员在 0 或 1,只有在 2。所以结果应该是:

a = [2]; // a has length 1

或者应该是(这将是上述结果):

a = [2,,undefined]; // a has length 3

或者

a = [2,,,]; // a has length 3 (IE may think it's 4, but that's wrong)

编辑

请注意,在 OP 中,结果为:

var b = [,,2];
b.move(0,2);

alert(b); // [,2,];

这可能不是预期的,并且

b.move(2,0);
alert(b); // [2,,];

所以它也不稳定。

于 2012-06-07T00:44:02.063 回答