说,我有一个看起来像这样的数组:
var playlist = [ {artist:"Herbie Hancock", title:"Thrust"}, {artist:"Lalo Schifrin", title:"Shifting Gears"}, {artist:"Faze-O", title:"Riding High"} ];
如何将元素移动到另一个位置?
我想举例,{artist:"Lalo Schifrin", title:"Shifting Gears"}
到最后.
我尝试使用splice,如下所示:
var tmp = playlist.splice(2,1); playlist.splice(2,0,tmp);
但它不起作用.
语法Array.splice
是:
yourArray.splice(index, howmany, element1, /*.....,*/ elementX);
哪里:
index是要从中开始删除元素的数组中的位置
howmany是你想要从索引中删除多少元素
element1,...,elementX是您想要从位置索引插入的元素.
这意味着splice()
可以使用它来删除元素,添加元素或替换数组中的元素,具体取决于您传递的参数.
请注意,它返回已删除元素的数组.
好的和通用的东西是:
Array.prototype.move = function (from, to) { this.splice(to, 0, this.splice(from, 1)[0]); };
然后使用:
var ar = [1,2,3,4,5]; ar.move(0,3); alert(ar) // 2,3,4,1,5
图:
如果你知道索引,你可以轻松地交换元素,使用这样一个简单的函数:
function swapElement(array, indexA, indexB) { var tmp = array[indexA]; array[indexA] = array[indexB]; array[indexB] = tmp; } swapElement(playlist, 1, 2); // [{"artist":"Herbie Hancock","title":"Thrust"}, // {"artist":"Faze-O","title":"Riding High"}, // {"artist":"Lalo Schifrin","title":"Shifting Gears"}]
数组索引只是数组对象的属性,因此您可以交换其值.
对于那些感兴趣的人,这是一个不可变的版本:
function immutableMove(arr, from, to) { return arr.reduce((prev, current, idx, self) => { if (from === to) { prev.push(current); } if (idx === from) { return prev; } if (from < to) { prev.push(current); } if (idx === to) { prev.push(self[from]); } if (from > to) { prev.push(current); } return prev; }, []); }
删除元素时,将2更改为1作为splice调用中的第一个参数:
var tmp = playlist.splice(1, 1); playlist.splice(2, 0, tmp[0]);