重新排列数组
说,我有一个数组,看起来像这样:
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"}
到最后。
我尝试使用拼接,像这样:
var tmp = playlist.splice(2,1); playlist.splice(2,0,tmp);
但它不起作用。
Array.splice
的语法是:
yourArray.splice(index, howmany, element1, /*.....,*/ elementX);
哪里:
- index是要开始从中删除元素的数组中的位置
- howmany是你想从索引中删除多less个元素
- element1,…,elementX是要从位置索引插入的元素。
这意味着splice()
可以用来删除元素,添加元素或者replace数组中的元素,具体取决于你传递的参数。
请注意,它将返回已移除元素的数组。
一些好的和通用的将是:
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; }, []); }
删除元素时,将拼版调用中的第一个参数更改为1:
var tmp = playlist.splice(1,1); playlist.splice(2,0,tmp);
如果您目前不知道logging的位置,则可以始终使用sorting方法:
playlist.sort(function (a, b) { return a.artist == "Lalo Schifrin" ? 1 // Move it down the list : 0; // Keep it the same });
尝试这个:
playlist = playlist.concat(playlist.splice(1, 1));
如果你只想从一个任意的位置移动一个项目到数组的末尾,这应该工作:
function toEnd(list, position) { list.push(list.splice(position, 1)); return list; }
如果你想从一些任意位置移动多个项目到最后,你可以这样做:
function toEnd(list, from, count) { list.push.apply(list, list.splice(from, count)); return list; }
如果您想将多个项目从某个任意位置移动到某个任意位置,请尝试:
function move(list, from, count, to) { var args = [from > to ? to : to - count, 0]; args.push.apply(args, list.splice(from, count)); list.splice.apply(list, args); return list; }