[removed] move objects from one array to another: Best approach?

后端 未结 7 635
臣服心动
臣服心动 2021-01-04 01:38

I have two arrays, called \'objects\' and \'appliedObjects\'. I\'m trying to come up with an elegant way in Javascript and/or Angular to move objects from one array to anot

相关标签:
7条回答
  • 2021-01-04 02:04

    You are altering the array while iterating on it, you will always miss some elements.

    One way of doing it would be to use a third array to store the references of the objects that need to be removed from the array:

    // "$scope.add" case
    var objectsToRemove = [];
    
    $scope.objects.forEach(function (value) {
      if (value.selected) {
        value.selected = false;
        $scope.appliedObjects.push(value);
        objectsToRemove.push(value);
      }
    });
    
    objectsToRemove.forEach(function (value) {
      $scope.objects.splice($scope.objects.indexOf(value), 1);
    });
    
    0 讨论(0)
  • 2021-01-04 02:07

    When a construct does too much automatically (like forEach, or even a for-loop, in this case), use a more primitive construct that allows you to say what should happen clearly, without need to work around the construct. Using a while loop, you can express what needs to happen without resorting to backing up or otherwise applying workarounds:

    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++;
        }
    }
    
    0 讨论(0)
  • 2021-01-04 02:08

    You can use this oneliner as many times as many items you need to move from arr1 to arr2 just prepare check func

    arr2.push(arr1.splice(arr1.findIndex(arr1El => check(arr1El)),1)[0])
    
    0 讨论(0)
  • 2021-01-04 02:13

    If you wish to move simply whole array you could do:

    appliedObjects = objects;
    objects = []
    

    Of course it won't work if they were parameters of a function! Otherwise I cannot see other way than copying in the loop, e.g.

    while (objects.length) {
        appliedObjects.push(objects[0]);
        objects.splice(0,1);
    }
    

    or if you like short code :) :

    while (objects.length) appliedObjects.push(objects.splice(0,1));
    

    check fiddle http://jsfiddle.net/060ywajm/

    0 讨论(0)
  • 2021-01-04 02:19
    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);
    }
    
    0 讨论(0)
  • 2021-01-04 02:19

    This is a first pass at what I think will work for you. I'm in the process of making a test page so that I can test the accuracy of the work and will update the tweaked result, which hopefully there will not be.

    EDIT: I ran it and it seems to do what you are wanting if I understand the problem correctly. There were a couple of syntax errors that I edited out.

    Here's the plunk with the condensed, cleaned code http://plnkr.co/edit/K7XuMu?p=preview

    HTML

    <button ng-click="transferArrays(objects, appliedObjects)">Add</button>
    <button ng-click="transferArrays(appliedObjects, objects)">Remove</button>
    

    JS

    $scope.transferArrays = function (arrayFrom, arrayTo) {
    var selectedElements;
    selectedElements = [];
    angular.forEach(arrayFrom, function(element) {
      if (element.isSelected) {
        element.isSelected = false;
        selectedElements.push(element);
      }
    });
    angular.forEach(selectedElements, function(element) {
      arrayTo.push(arrayFrom.splice(
        arrayFrom.map(function(x) {
          return x.uniqueId;
        })
        .indexOf(element.uniqueId), 1));
    });
    };
    

    Old code

    $scope.remove = function () {
            var selectedElements;
            selectedElements = [];
            angular.forEach($scope.appliedObjects, function (element) {
                if (element.isSelected) {
                    element.isSelected = false;
                    selectedElements.push(element);
                }
            });
            angular.forEach(selectedElements, function (element) {
                $scope.objects.push($scope.appliedObjects.splice(
                    $scope.appliedObjects.map(function  (x) { return x.uniqueId; })
                    .indexOf(element.uniqueId), 1));
            });
        };
    
    $scope.add = function () {
            var selectedElements;
            selectedElements = [];
            angular.forEach($scope.objects, function (element) {
                if (element.isSelected) {
                    element.isSelected = false;
                    selectedElements.push(element);
                }
            });
            angular.forEach(selectedElements, function (element) {
                $scope.appliedObjects.push($scope.objects.splice(
                    $scope.objects.map(function  (x) { return x.uniqueId; })
                    .indexOf(element.uniqueId), 1));
            });
        };
    
    0 讨论(0)
提交回复
热议问题