如何在 for 循环中进行映射

How to map within a for loop

我们需要在 for 循环中映射对象数组,这确实有效,但编辑器警告我们不要将函数放在循环中:

for(var i=0; i<$scope.data.list.length; i++){
    $scope.data.list[i].isRowSelected=false;

    var pos1 = $scope.selectedItems.map(function(e) { return e.sys_id; }).indexOf($scope.data.list[i].sys_id);
    if(pos1!==-1){
        var add = $scope.selectedItems.indexOf($scope.data.list[i].sys_id);
        $scope.selectedItems.splice(add,1);
    }
} 

为了缓解这种情况,我们正在考虑为映射创建一个单独的函数,然后在循环中调用它,如下所示:

function mappingID(e){
  return e.sys_id;
}

然而,当我们在循环中调用它时,我们不知道要传递什么...有什么建议吗?谢谢!

评论建议lodash,这个建议不错。但是,出于原始问题的目的,您可以按原样声明函数 mappingID ,然后简单地把

var pos1 = $scope.selectedItems.map(mappingID).indexOf($scope.data.list[i].sys_id);

这样就可以了。

你不需要带lodash来处理这个,你可以使用findhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find

for(var i=0; i<$scope.data.list.length; i++){
    $scope.data.list[i].isRowSelected=false;

    var item = $scope.selectedItems.find(e => (e.sys_id === $scope.data.list[i].sys_id));

    if (item) {
        $scope.selectedItems.splice(item,1);
    }
} 

此外,我建议将 selectedItems 更改为 plain-object/Map/Set,这样您就可以在恒定时间内进行查找。

两件事,在循环外创建一个函数,避免重复索引和对象嵌套。它将使您的代码更清晰,更易于推理。我很确定整个功能可以做得更好,但我不确定更大的范围

var items = $scope.selectedItems;
var sys_id = function(e) { return e.sys_id; }
for(var i=0; i<$scope.data.list.length; i++){
    var data = $scope.data.list[i];  // might be a better name for this...
    data.isRowSelected=false;

    var pos1 = items.map(sys_id).indexOf(data.sys_id);
    if(pos1!==-1){
        var add = items.indexOf(data.sys_id);
        items.splice(add,1);
    }
} 

为避免在循环的每次迭代中都执行相同的映射,请将映射移到循环外:

var idArr = $scope.selectedItems.map(function(e) { return e.sys_id; })

$scope.data.list.forEach(item => {
    item.isRowSelected=false;

    var pos1 = idArr.indexOf(item.sys_id);
    if(pos1!==-1){
        var add = $scope.selectedItems.indexOf(item.sys_id);
        $scope.selectedItems.splice(add,1);
    }
})