2014-01-20 165 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]