如何在for循环中进行映射

时间:2019-12-10 16:47:08

标签: javascript object for-loop array-map

我们需要在一个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;
}

但是,当我们在循环中调用它时,我们迷失了传递的内容...任何建议?谢谢!

4 个答案:

答案 0 :(得分:1)

评论建议lodash,这是一个很好的建议。但是,出于原始问题的目的,您可以在拥有函数时声明函数mappingID,然后简单地放入

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

这将完成工作。

答案 1 :(得分:1)

您不需要携带破折号即可处理,可以使用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更改为一个普通对象/地图/集合,以便您可以在恒定时间内进行查找。

答案 2 :(得分:1)

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

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);
    }
} 

答案 3 :(得分:0)

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

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);
    }
})