移除性能代价高的函数
Remove function with high cost in performance
我认为自己是新手。所以我有一个问题要问你。
我有这个功能
$scope.addLeagueToLines = function(league) {
league.active = !league.active;
if (league.active && !_.contains($scope.lineLeagues, league)) {
$scope.lineLeagues.push(league);
}else {
_.remove($scope.lineLeagues, function(lineLeague) {
return _.contains(lineLeague, league);
});
}
};
在第一个条件if
中,一切正常,工作正常,推league
顺利。当我尝试删除 else
部分中的 league
时,问题就来了。有时 league
带有很多数据,比如说 200 项,所以当你推送联赛时不是问题。问题是当您尝试删除 else
中的那 200 项时,应用程序在该部分变慢。
那么,我应该怎么做才能在这个函数中以更好的方式删除项目?
我正在与 lodash
合作,以防万一。
你还有什么想知道的吗?
更新
这是 $scope.lineLeagues
returns 在控制台日志中的内容
[
{
"id": "1517",
"composedId": "15170G",
"name": "NBA - Team Totals",
"lineType": "G",
"part": "0",
"offeringsAvailable": 2,
"sport": {
"id": 8
},
"active": true
},
{
"id": "5932",
"composedId": "59320G",
"name": "NBA",
"lineType": "G",
"part": "0",
"offeringsAvailable": 20,
"sport": {
"id": 8
},
"active": false
}
]
参数league
{
"id": "1496",
"composedId": "14961I",
"name": "MLB (1I)",
"lineType": "I",
"part": "1",
"offeringsAvailable": 30,
"sport": {
"id": 6
},
"active": false
}
$scope.lineLeagues
数组的项目是什么?看起来它们应该是 league
个对象。
如果是这样,那么我不确定您 else
分支中的逻辑。
不应该是:
leaguesToRemove = _.remove($scope.lineLeagues, function(lineLeague) {
return _.isEqual(lineLeague, league);
});
编辑
看到问题的更新后,根据$scope.lineLeagues
的内容,确认问题是_.contains(lineLeague, league);
。
此时 lineLeague
是一个 JS 对象,您正在检查它是否包含另一个对象。
真正发生的是 lodash 将迭代您的 $scope.lineLeagues
数组,然后对于每个对象,将每个 属性 与您传递给 _.contains()
的第二个参数进行比较: league
对象。
你真正想要的是
_.remove($scope.lineLeagues, function(lineLeague) {
return lineLeague == league;
});
不知道为什么 _.contains
会进去。它不必要地枚举 lineLeague
的所有属性(将对象视为集合)并尝试在其中找到 league
作为值。
您也可以将其简化为
_.pull($scope.lineLeagues, league)
我认为自己是新手。所以我有一个问题要问你。
我有这个功能
$scope.addLeagueToLines = function(league) {
league.active = !league.active;
if (league.active && !_.contains($scope.lineLeagues, league)) {
$scope.lineLeagues.push(league);
}else {
_.remove($scope.lineLeagues, function(lineLeague) {
return _.contains(lineLeague, league);
});
}
};
在第一个条件if
中,一切正常,工作正常,推league
顺利。当我尝试删除 else
部分中的 league
时,问题就来了。有时 league
带有很多数据,比如说 200 项,所以当你推送联赛时不是问题。问题是当您尝试删除 else
中的那 200 项时,应用程序在该部分变慢。
那么,我应该怎么做才能在这个函数中以更好的方式删除项目?
我正在与 lodash
合作,以防万一。
你还有什么想知道的吗?
更新
这是 $scope.lineLeagues
returns 在控制台日志中的内容
[
{
"id": "1517",
"composedId": "15170G",
"name": "NBA - Team Totals",
"lineType": "G",
"part": "0",
"offeringsAvailable": 2,
"sport": {
"id": 8
},
"active": true
},
{
"id": "5932",
"composedId": "59320G",
"name": "NBA",
"lineType": "G",
"part": "0",
"offeringsAvailable": 20,
"sport": {
"id": 8
},
"active": false
}
]
参数league
{
"id": "1496",
"composedId": "14961I",
"name": "MLB (1I)",
"lineType": "I",
"part": "1",
"offeringsAvailable": 30,
"sport": {
"id": 6
},
"active": false
}
$scope.lineLeagues
数组的项目是什么?看起来它们应该是 league
个对象。
如果是这样,那么我不确定您 else
分支中的逻辑。
不应该是:
leaguesToRemove = _.remove($scope.lineLeagues, function(lineLeague) {
return _.isEqual(lineLeague, league);
});
编辑
看到问题的更新后,根据$scope.lineLeagues
的内容,确认问题是_.contains(lineLeague, league);
。
此时 lineLeague
是一个 JS 对象,您正在检查它是否包含另一个对象。
真正发生的是 lodash 将迭代您的 $scope.lineLeagues
数组,然后对于每个对象,将每个 属性 与您传递给 _.contains()
的第二个参数进行比较: league
对象。
你真正想要的是
_.remove($scope.lineLeagues, function(lineLeague) {
return lineLeague == league;
});
不知道为什么 _.contains
会进去。它不必要地枚举 lineLeague
的所有属性(将对象视为集合)并尝试在其中找到 league
作为值。
您也可以将其简化为
_.pull($scope.lineLeagues, league)