繁体   English   中英

在推送新的 object 之前检查阵列是否相同 object

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM