在Array原型中使用array.splice

时间:2012-06-06 22:13:52

标签: javascript

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不是函数”,但它会返回所需的结果。为什么呢?

3 个答案:

答案 0 :(得分: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]);
        }
    }
};

由于某种原因,该函数正由被调用的文件调用(仍然没有完全想到那个)。我添加了一些检查以验证这是一个数组,然后如果提供的int大于总长度,则还将新索引重置为等于总大小。这解决了我遇到的错误问题,对我而言,这是在数组中移动对象的最简单方法。至于函数调用onload的原因必须与我的代码有关。

答案 1 :(得分: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
*/

答案 2 :(得分:0)

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

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

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或者不存在的情况下要执行的操作,依此类推。 e.g。

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,,];

所以它也不稳定。