重新排列数组

说,我有一个数组,看起来像这样:

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; }