2014-01-20 2 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] 
Смежные вопросы