将数组元素从一个数组位置移到另一个数组位置
我很难弄清楚如何移动一个数组元素。 例如,给定以下内容:
var arr = [ 'a', 'b', 'c', 'd', 'e'];
如何在'b'
之前写一个函数来移动'd'
'b'
?
或'a'
'c'
之后的'c'
?
移动之后,其余元素的索引应该更新。 这意味着在移动后的第一个例子中,arr [0]会='a',arr [1] ='d'arr [2] ='b',arr [3] ='c',arr [4] = 'E'
这看起来应该很简单,但是我无法把头围住。
如果你想在npm上使用版本,array-move是最接近这个答案的,尽管它不是相同的实现。 请参阅其用法部分了解更多详情。 这个答案的前一个版本(修改后的Array.prototype.move)可以在npm的array.prototype.move处找到。
我用这个函数取得了相当不错的成功:
function array_move(arr, old_index, new_index) {
if (new_index >= arr.length) {
var k = new_index - arr.length + 1;
while (k--) {
arr.push(undefined);
}
}
arr.splice(new_index, 0, arr.splice(old_index, 1)[0]);
return arr; // for testing
};
// returns [2, 1, 3]
console.log(array_move([1, 2, 3], 0, 1));
这里是我在JSPerf上找到的一个班轮....
Array.prototype.move = function(from, to) {
this.splice(to, 0, this.splice(from, 1)[0]);
};
这是非常棒的阅读,但如果你想要性能(小数据集)尝试...
Array.prototype.move2 = function(pos1, pos2) {
// local variables
var i, tmp;
// cast input parameters to integers
pos1 = parseInt(pos1, 10);
pos2 = parseInt(pos2, 10);
// if positions are different and inside array
if (pos1 !== pos2 && 0 <= pos1 && pos1 <= this.length && 0 <= pos2 && pos2 <= this.length) {
// save element from position 1
tmp = this[pos1];
// move element down and shift other elements up
if (pos1 < pos2) {
for (i = pos1; i < pos2; i++) {
this[i] = this[i + 1];
}
}
// move element up and shift other elements down
else {
for (i = pos1; i > pos2; i--) {
this[i] = this[i - 1];
}
}
// put element from position 1 to destination
this[pos2] = tmp;
}
}
我无法相信,应该都是理查德斯卡罗特。 它在这个性能测试中击败了较小数据集的基于拼接的方法。 然而,Darwayne指出,它在大型数据集上速度要慢得多。
我喜欢这种方式。 它工作,它快速和优雅。
function arraymove(arr, fromIndex, toIndex) {
var element = arr[fromIndex];
arr.splice(fromIndex, 1);
arr.splice(toIndex, 0, element);
}
注意:一定要记得检查你的数组边界。
链接地址: http://www.djcxy.com/p/19037.html上一篇: Move an array element from one array position to another