Javascript:将对象从一个数组移动到另一个数组:最佳方法?

mor*_*pdx 14 javascript arrays angularjs

我有两个数组,称为'对象'和'appliedObjects'.我试图用Javascript和/或Angular中的优雅方式将对象从一个数组移动到另一个数组.

最初我做了这样的事情:

   $scope.remove = function () {
        angular.forEach($scope.appliedObjects, function (element, index) {
            if (element.selected) {
                element.selected = false;
                $scope.objects.push(element);
                $scope.appliedObjects.splice(index, 1);
            }
        });
    }

   $scope.add= function () {
        angular.forEach($scope.objects, function (element, index) {
            if (element.selected) {
                element.selected = false;
                $scope.appliedObjects.push(element);
                $scope.objects.splice(index, 1);
            }
        });
    }
Run Code Online (Sandbox Code Playgroud)

但后来我意识到,当从循环数组中删除值时,它不会添加或删除所有其他项,因为它是通过索引进行的.

然后我尝试使用临时数组来保存要添加或删除的项目列表,我开始得到奇怪的参考问题.

我开始关注这个问题的最佳解决方案......任何帮助和/或指导都会非常感激.

Art*_*tem 12

function moveElements(source, target, moveCheck) {
    for (var i = 0; i < source.length; i++) {
        var element = source[i];
        if (moveCheck(element)) {
            source.splice(i, 1);
            target.push(element);
            i--;
        }
    } 
}

function selectionMoveCheck(element) {
   if (element.selected) {
       element.selected = false;
       return true;
   }
}

$scope.remove = function () {
    moveElements($scope.appliedObjects, $scope.objects, selectionMoveCheck);
}

$scope.add = function () {
    moveElements($scope.objects, $scope.appliedObjects, selectionMoveCheck);
}
Run Code Online (Sandbox Code Playgroud)


Ed *_*aub 6

当一个构造自动执行太多时(比如forEach,或者甚至是for循环,在这种情况下),使用一个更原始的构造,允许你说清楚应该发生什么,而不需要解决构造.使用while循环,您可以表达需要执行的操作,而无需使用备份或以其他方式应用变通方法:

    function moveSelected(src, dest)  {
        var i = 0;
        while ( i < src.length ) {
            var item = src[i];
            if (item.selected) {
                src.splice(i,1);
                dest.push(item);
            }
            else i++;
        }
    }
Run Code Online (Sandbox Code Playgroud)