[英]Check array for identical object before pushing new object
我难住了。
我有一个看起来像这样的对象数组:
arr = [{source:someID, target:someID},{source:someID, target:someID},...]
在某个阶段之后,数组的长度达到约 20000。 此时代码运行中,数组中的每个 object 都是完全唯一的。
我需要打开 go 并将更多对象添加到数组中,但我不想要任何双倍。 在这个过程中,当两个对象共享一个相似的键值时,另一个数组被循环以创建新对象。 然后将这些新对象推送到上述数组。 有没有一种方法可以测试,以便仅当上述数组尚未包含相同的 object 时才将新对象推送到此数组。
我不是最精通JS的,还在学习中。 到目前为止,我想到了使用嵌套循环
let testArr = [{code: num, id:num},{code: num, id:num},{code: num, id:num},…] // object being looped over to create more objects for above arr
let testData = testArr;
let arr = [{{source:someID, target:someID},{source:someID, target:someID},...}] // array being added to
let len = testArr.length;
for (let i = 0; i < len; i++) {
let objectTest = testData.findIndex((e) => e.uniqueID.includes(testArr[i].uniqueID));
if (objectTest !== -1) {
if (testArr[i].id !== testData[objectTest].id) {
let testObj = {
source: testArr[i].id,
target: testData[objectTest].id,
};
for (let a = 0; a < arr.length; a++) {
if (deepEqual(arr[a], testObj) === false) {
const newLink = new Object();
newLink.source = testArr[i].id;
newLink.target = testData[objectTest].id;
arr.push(newLink);
}
}
}
}
}
对于 deepEqual function,我尝试了许多不同的函数迭代(大多数在此处找到),这些函数旨在测试对象/数组是否相同,我认为这些函数本身不是问题。
运行此代码时,我用完了 memory ( JavaScript 堆出 memory )并且应用程序终止。 最初运行浏览器,但将其移至 Node.js。 如果我将最大 ram 节点可以使用的内存增加到 16gb,应用程序仍会以以下代码终止: Fatal JavaScript invalid size error 156627439 。
我坚持的是一种有效的方法,我可以检查数组以查看是否已经存在相同的 object ,如果是,则跳过它。
任何指针将不胜感激。
我能看到的最大问题是在这段代码中:
for (let a = 0; a < arr.length; a++) {
if (deepEqual(arr[a], testObj) === false) {
const newLink = new Object();
newLink.source = testArr[i].id;
newLink.target = testData[objectTest].id;
arr.push(newLink);
}
}
您正在循环 while a < arr.length
,但是您推入了同一个数组,因此长度增加了。 此外,如果您没有找到相等的 object,则为每个条目推送 object。
假设有 10 个元素,并且没有一个 object 作为您要在内部检查的元素:在第一次迭代中 deepEqual 返回 false 并且您推送元素; 重复此步骤,您将推送 10 次相同的元素,并且 arr.length 现在为 20,因此将再进行 10 次迭代,其中deepEqual
返回 true 并且您不会推送新的 object。
现在只需使用 20000 个元素进行相同的图像处理。
您应该只检查它是否存在于数组中,然后最终推送它。 尝试用以下解决方案替换上述内容:
const doesNotContainEqual = arr.every((obj) => !deepEqual(obj, testObj));
if (doesNotContainEqual) {
const newLink = new Object();
newLink.source = testArr[i].id;
newLink.target = testData[objectTest].id;
arr.push(newLink);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.