【发布时间】:2017-09-26 13:18:08
【问题描述】:
我制作了一个脚本,可以在对象数组中找到一个键的重复项。如果找到重复项,则将新键和值(“Duplicate”:true)添加到具有重复键值的对象中。
数据示例
{
"Id": "1",
"NI Number": "NG111111A",
"Full Name": "Test Test Tester",
"Address Line 1": "My House",
"Address Line 2": "My Road",
"Address Line 3": "My Suburb",
"City / Town": "My Town",
"Country": "United Kingdom",
"PostCode": "",
"Creation Date": "24 December 2014"
},
{
"Id": "2",
"NI Number": "NM123405C",
"Full Name": "A Dummy",
"Address Line 1": "Dummy 1",
"Address Line 2": "Dummy 2",
"Address Line 3": "Dummy 3",
"City / Town": "Dummy 4",
"Country": "United Kingdom",
"PostCode": "",
"Creation Date": "09 February 2015"
}
脚本
for (let i = 0, len = cleanedData.length; i < len; i++) {
let foundDuplicate = false;
if (cleanedData[i]["Duplicate"] === "false" || cleanedData[i]["Duplicate"] === undefined) {
for (let t = i + 1, len = cleanedData.length; t < len; t++) {
if (cleanedData[i]["NI Number"] === cleanedData[t]["NI Number"]) {
foundDuplicate = true;
cleanedData[t]["Duplicate"] = true;
}
}
if (foundDuplicate === true) {
cleanedData[i]["Duplicate"] = true;
} else {
cleanedData[i]["Duplicate"] = false;
}
}
}
我正在尝试在 33,000 条记录中查找重复的“NI 编号”。 NI 编号可以重复多次。该脚本当前按预期工作,但运行时间超过 70 秒。如果可能的话,我想将其缩短到 35 秒。
我是 JavaScript 新手,但从我所阅读的内容来看,使用缓存长度的 for 循环是迭代数组的快速方法。我已阅读该地图,设置可以提高性能,但我不确定如何将它们实现到我的脚本中。
有什么方法可以提高我的代码的性能吗?
【问题讨论】:
-
你有一些问题,例如
cleanedData[i]["Duplicate"] === "false"将始终为 false,因为您将值设置为布尔值,然后与字符串进行严格比较。考虑if (!cleanedData[i].Duplicate) {...}。 -
你可以异步编写它,但是你必须把它分成两个函数,一个是回调函数,所以对象中的每个变量都会同时检查重复。
-
@RobG 谢谢,很好发现。
-
您的脚本运行 n^2 次。一个简单的解决方案是创建一个查找变量,遍历您的数据,检查查找变量中是否存在
NI Number;如果存在,则将当前项目标记为重复,否则在查找变量中添加键。这会循环 n 次。 -
@SalmanA — 第一个重复项也必须标记为重复项,因此查找还需要存储该值的第一个实例的索引,例如
{"NG111111A":0,"NM123405C":1,...}.
标签: javascript arrays object for-loop duplicates