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

新手上路,请多包涵

我有两个数组,分别称为“objects”和“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);
            }
        });
    }

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

然后我尝试使用一个临时数组来保存要添加或删除的项目列表,然后我开始遇到奇怪的引用问题。

我开始思考这个问题的最佳解决方案是什么……非常感谢任何帮助和/或指导。

原文由 morganpdx 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 502
2 个回答
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);
}

原文由 Artem 发布,翻译遵循 CC BY-SA 3.0 许可协议

当一个构造自动执行太多操作时(例如 forEach,甚至是 for-loop,在这种情况下),使用更原始的构造,它允许您清楚地说出应该发生什么,而无需绕过该构造。使用 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++;
    }
}

原文由 Ed Staub 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题