Невозможно переупорядочить массив объектов в 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 выполнять синхронизацию... то, для чего он предназначен.
Вкратце, взгляните на этот модуль, возможно, он облегчит вашу жизнь:
Я думаю, ваш код работает нормально, а журнал - нет.
console.log
может не представлять значения во время выполнения, но во время просмотра, особенно с многомерными объектами и массивами.
Попробуйте другой журнал, чтобы увидеть console.log($scope[0].a, $scope[1].a, $scope[2].a)
Возможно, вы захотите проверить в другом brwoser, так как это кажется проблемой Chrome, смотрите здесь:
Неужели консоль JavaScript в Chrome ленилась оценивать массивы?
Неверное значение в console.log