手记

对数组中元素移动的一点思考。

var arr = [0,1,2,3,4,5,6];
现在想要让数组中的第四个元素,也就是3移动到1的位置。我们有很多种方法,一种最直接的方法是采用数组的内置方法splice();用splice就存在一个选择,先删除3呢还是先将3插入1的位置。现在我们不讨论先移动,我们讨论先删除的情况。

先删除3,splice方法会返回你删除的东西。现在有两个选择,你将这个删除的东西放到1的位置,或者直接将3放到1的位置。那怎么选择呢?将3直接放到1的位置,因为splice返回的值是放在数组中的,现在你想要将这个东西取出来,用toString不好,join不好,只能采用下标的方式[0]这样访问,那就太麻烦了。所以采用将3直接放到1的位置。

这样完全就没有问题了吗?是的,如果你只考虑将后面的元素放到前面那么你就成功了,可是现在我想要将3放到5的位置。此时就会想一个问题,我是先删除3,那么实际上5的位置是向前进了一位,数组长度也相当与小了1。这个时候你想要放到的位置(i)是不是已经变了呢?

的确已经变了。可是我们就要修改(i)的值吗?把i变成(i-1)?答案是不用。此时我们换一个思路来思考,我们现在不将3移动到1和5的位置,我们将3移动到2和4的位置。移动到2位置,我们是不是想要将3放到2之前呢,将数组变长[0,1,3,2,4,5,6]这样没问题吧,也就是我们想将3移动到前面元素之前。而我们将3移动到4的位置,是不是想要竟数组变成这样呢[0,1,2,4,3,5,6],也就是我们想要将3移动到后面元素之后。所以此时4正好向前面移动了一位,在不修改(i)值的前提下正好满足条件。perfect!所以其实不思考直接用就ok啦^_^。

但是如果采用先移动再删除的方法就要判断向前移动还是向后移动,所以最好的实践就是采用先删除再移动,一步搞定。

6人推荐
随时随地看视频
慕课网APP

热门评论

Array.prototype.swap = function (index1, index2) {
    this.splice(index2, 0, this.splice(index1, 1).shift());
};

let array = [1,2,3,4,5,6];
array.swap(3, 0); // result:[4, 1, 2, 3, 5, 6]

Array.prototype.swap = function (index1, index2) {
    this.splice(index2, 0, this.splice(index1, 1).shift());
};

let array = [1,2,3,4,5,6];
array.swap(3, 0); // result:[4, 1, 2, 3, 5, 6]

http://img.mukewang.com/59db20ab000155a906000219.jpg

这样就可以了,简单明了。

查看全部评论