【问题标题】:Facing very bad performance for angular.copy for large array大型数组的 angular.copy 面临非常糟糕的性能
【发布时间】:2016-06-29 03:06:18
【问题描述】:

[编辑]

我们发现问题不是正则表达式,而是 angular.copy。因此我将问题从 RegEx 问题更新为 Angular.copy 问题。

[原创]

例如,我想在所有记录中将名称从格式“BD12”更改为“BD”,并且我有一个大约为 10 的数组。此对象类型的 3000 条记录:

{
Name: "BD12",
PostCode: "SE 15477 28954",
State_Id: 2,
State: null,
Country_Id: 2,
Country: "United Kingdom",
GridReference: null,
Region: null,
AreaCode: "01274",
Latitude: 53.75672,
Longitude: -1.7667413,
Easting: 415477,
Northing: 428954,
Id: 2
}

我正在使用 Array.map 函数进行此计算,在我的 64 位 Dell Latitude E5540 上使用 8GB ram Intel CoreI5 2 和 2.6 GHz 大约需要 30 秒到 1 分钟。

data.results = [];//contains [2500] records
$scope.outWardCodes = angular.copy(data.results)
.map(wc=> { wc.Name = wc.Name.match("^[a-zA-Z]+"); return wc }));

如何改进?

[编辑] 我还需要原始数组。

【问题讨论】:

  • 你能告诉我们做angular.copy(data.results)需要多长时间吗?以及用data.results.slice(0) 替换它做了多少改进?
  • 哦 Angularrrrrrrrrrrrrrrrr。当我测试 angular.copy(data.results) 时,它一直花费了 2 分 48 秒。地图功能只需要几毫秒。第二个问题是结果是微风.js 具有大量对象遍历引用的对象可能也是问题所在。 Array.slice 只需要毫秒。 :P
  • 我应该删除问题还是编辑它?
  • 将此作为答案发布,因为它可以帮助某人做出正确的决定。

标签: javascript arrays regex performance large-data


【解决方案1】:

替换

angular.copy(data.results)

data.results.map(function(value){value = Object.create(value);return value});

或者干脆

$scope.outWardCodes = data.results.map(function(value){value = Object.create(value); value.Name = value.Name.match("^[a-zA-Z]+"); return value});

【讨论】:

  • 等一下!我需要一份副本。我想删除对旧数组的引用。这个“切片”仍然保留对旧数组的引用,因此编辑也会影响它。
  • 没有切片返回新数组
  • 在 chrome 中检查这个。 var aa = [{name:"aa"}]; var bb = aa.slice(0); bb[0].name="bb";控制台.log(aa[0]);
  • @ahmadalibaloch 试试更新的代码,让我知道性能
  • 我认为答案和问题的上下文已经改变.. 和旧的循环解决方案,虽然有效;)
猜你喜欢
  • 1970-01-01
  • 2011-12-19
  • 2018-01-16
  • 2021-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-26
相关资源
最近更新 更多