大型数组的 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? (深拷贝)

angular.copy() 和 JSON.parse(JSON.stringify()) 之间的区别?

angular.js 的angular.copy angular.extend angular.merge

Angular.js 中 copy 赋值与 = 赋值 区别

iOS 上的解析平台:大型多对多的关系、联接或数组?