Переместить элемент вверх / вниз массив в JavaScript


У меня есть массив называется list связанной с текущим применения $scope то есть пользователь заказа-возможность список компонентов пользовательского интерфейса. При нажатии вверх / вниз массивов эти функции отвечают за перемещение элемента, повторно вставив его в правильное место.

$scope.moveUp = function(index)
{
    if (index === 0) {
        return;
    }
    $scope.list.splice(index - 1, 0, $scope.list.splice(index, 1)[0]);
};

$scope.moveDown = function(index)
{
    if (index === $scope.list.length - 1) {
        return;
    }
    $scope.list.splice(index + 1, 0, $scope.list.splice(index, 1)[0]);
};


2553
0
задан 15 февраля 2018 в 09:02 Источник Поделиться
Комментарии
1 ответ

То, что вы делаете не очень эффективно. Сначала вы удалить элемент из массива, и, чтобы закрыть разрыв, каждый элемент после его перемещения установки. Затем нужно вставить элемент снова, и, чтобы освободить место для него, каждый отдельный элемент после того, как он снова вперед, туда, где они начали.1

Что вы делаете, это просто перестановка элементов в массиве. Нет необходимости делать какие-либо манипуляции массив или коснуться любого из других элементов.

$scope.moveUp = function(index)
{
if (index === 0) {
return;
}
[$scope.list[index], $scope.list[index-1]] = [$scope.list[index-1], $scope.list[index]];
};

$scope.moveDown = function(index)
{
if (index === $scope.list.length - 1) {
return;
}
[$scope.list[index], $scope.list[index+1]] = [$scope.list[index+1], $scope.list[index]];
};

Я использую деконструкцию , чтобы поменять значения. По существу, это способ, чтобы присвоить несколько значений одновременно, без временной переменной.

1 Вот как это работает в теории по крайней мере. Это будет зависеть от внутренней работы движка JavaScript, и будет ли он оптимизирован для такого рода задач.

2
ответ дан 15 февраля 2018 в 12:02 Источник Поделиться