如何在 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来处理这个,你可以使用find
:https://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);
}
})
我们需要在 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来处理这个,你可以使用find
:https://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);
}
})