Невозможно переупорядочить массив объектов в JS

У меня есть массив объектов, которые представлены пользователю в виде блоков. Они могут перетаскивать, чтобы изменить порядок появления этих блоков, и затем я хочу изменить положение объектов в массиве.

$scope.myArray = [{a:1,b:2,c:3}, {a:11,b:22,c:33}, {a:111,b:222,c:333}];

function orderChanged(event) {
  console.log($scope.myArray);
    //logs [{a:1,b:2,c:3}, {a:11,b:22,c:33}, {a:111,b:222,c:333}]

  console.log("source:", event.source.index, "dest:", event.dest.index);
    //logs source: 1 dest: 2

  $scope.myArray.move(event.source.index, event.dest.index);

  console.log($scope.myArray);
    //logs [{a:1,b:2,c:3}, {a:11,b:22,c:33}, {a:111,b:222,c:333}]
};

//this is going to rearrange the array
Array.prototype.move = function (from, to) {
  this.splice(to, 0, this.splice(from, 1)[0]);
};

Событие orderChange имеет исходный индекс и целевой индекс в виде целых чисел, которые представляют их порядок в том виде, в котором они представлены пользователю, который также отображается на их позиции в массиве до того, как произойдет какое-либо перемещение.

Я не могу переставить массив, каждый раз, когда я записываю массив в функцию orderChange, оба журнала возвращают один и тот же порядок.

Все остальные примеры переупорядочения массивов предназначены для массивов, которые не содержат объектов, мне интересно, не это ли портит мой код?

2 ответа

Решение

Я тестирую ваш код и работает нормально. Где вы модифицируете прототип Array? Просто попробуйте заменить вызов move() кодом, который на самом деле выполняет переупорядочение и тестирование...

В любом случае, вы используете AngularJS. Почему вы возитесь с DOM? Добавьте свойство с именем Order для каждого из ваших объектов и позвольте Angular выполнять синхронизацию... то, для чего он предназначен.

Вкратце, взгляните на этот модуль, возможно, он облегчит вашу жизнь:

http://ngmodules.org/modules/ng-sortable

Я думаю, ваш код работает нормально, а журнал - нет.

console.log может не представлять значения во время выполнения, но во время просмотра, особенно с многомерными объектами и массивами.

Попробуйте другой журнал, чтобы увидеть console.log($scope[0].a, $scope[1].a, $scope[2].a)

Возможно, вы захотите проверить в другом brwoser, так как это кажется проблемой Chrome, смотрите здесь:
Неужели консоль JavaScript в Chrome ленилась оценивать массивы?
Неверное значение в console.log

Другие вопросы по тегам