2014-01-20 124 views
1

我有一个对象数组,我想交换数组中两个元素的位置。 我尝试这样做:交换对象数组中的元素

var tempObject = array.splice(index, 1, array[index + 1]); 
array.splice(index+1, 1, tempObject); 

但它似乎并没有因为它会导致一些奇怪的错误,才能正常工作。例如,我无法使用该对象的方法。调用array[x].getName会导致错误。

任何身体都可以伸出援助之手吗?

为防万一它很重要,我用object.prototype添加方法。

回答

5

在你的代码中的错误是拼接返回项目的数组,而不是一个单一的项目。既然你抽取一个项目,你可以这样做:

var tempObject = array.splice(index, 1, array[index + 1])[0]; // get the item from the array 
array.splice(index+1, 1, tempObject); 

This answer提供了一个较短的版本,也使用拼接:

array[index] = array.splice(index+1, 1, array[index])[0]; 

Another very interesting answer是短期和fast

function identity(x){return x}; 

array[index] = identity(array[index+1], array[index+1]=array[index]); 
+0

[ http://jsperf.com/js-list-swap](http://jsperf.com/js-list-swap) - 使用拼接比一个临时变量慢得多。 – MT0

+0

非常感谢!完美工作! –

1

JSFIDDLE

var array_of_numbers = [5,4,3,2,1,0], 
    swap = function(array,a,b){var tmp=array[a];array[a]=array[b];array[b]=tmp;}; 
swap(array_of_numbers,0,4); 
// array_of_numbers now is [1,4,3,2,5,0] 

或者你可以做的功能添加到Array.prototype

JSFIDDLE

Array.prototype.swap = function(a,b){ var tmp=this[a];this[a]=this[b];this[b]=tmp;}; 
var array_of_numbers = [5,4,3,2,1,0]; 
array_of_numbers.swap(0,4); 
// array_of_numbers now is [1,4,3,2,5,0]