移除性能代价高的函数

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)