大型数组的 angular.copy 面临非常糟糕的性能
Posted
技术标签:
【中文标题】大型数组的 angular.copy 面临非常糟糕的性能【英文标题】:Facing very bad performance for angular.copy for large array 【发布时间】: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
我应该删除问题还是编辑它?
将此作为答案发布,因为它可以帮助某人做出正确的决定。
【参考方案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 试试更新的代码,让我知道性能 我认为答案和问题的上下文已经改变.. 和旧的循环解决方案,虽然有效;)以上是关于大型数组的 angular.copy 面临非常糟糕的性能的主要内容,如果未能解决你的问题,请参考以下文章
Angular 中 angular.copy 的替代方法是啥
angular.copy() 和 JSON.parse(JSON.stringify()) 之间的区别?