Estoy perplejo.
Tengo una matriz de objetos que se ve así:
arr = [{source:someID, target:someID},{source:someID, target:someID},...]
Después de cierta etapa, la longitud de la matriz alcanza alrededor de ~20000. En este punto de la ejecución del código, cada objeto dentro de la matriz es completamente único.
Necesito continuar y agregar más objetos a la matriz, pero no quiero que se dupliquen. En este proceso, se repite otra matriz para crear nuevos objetos cuando dos objetos comparten un valor de clave similar. Estos nuevos objetos luego se empujan a la matriz anterior. ¿Hay alguna manera de probar para que los nuevos objetos se envíen a esta matriz solo si la matriz anterior aún no contiene un objeto idéntico?
No soy el más competente en JS, y sigo aprendiendo. Hasta ahora, pensé en usar un bucle anidado
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); } } } } }Para la función deepEqual, probé numerosas iteraciones diferentes (la mayoría se encuentran aquí) de funciones diseñadas para probar si los objetos/matrices son idénticos y no creo que esas funciones por sí solas sean el problema.
Cuando ejecuto este código, me quedo sin memoria (memoria de JavaScript sin memoria ) y la aplicación finaliza. Originalmente estaba ejecutando el navegador, pero lo movió a Node. Si aumenté el máximo de RAM que el nodo podría usar a 16 gb, la aplicación aún terminaría con el código: Error fatal de tamaño no válido de JavaScript 156627439 .
En lo que estoy atascado es una forma válida en la que puedo verificar la matriz para ver si ya hay un objeto idéntico presente y luego omitirlo si es cierto.
Cualquier sugerencia sería muy apreciada.
El mayor problema que puedo ver está dentro de este fragmento de código:
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); } } Está haciendo un bucle mientras a < arr.length , pero presiona la misma matriz, por lo que la longitud aumenta. Además, presiona un objeto para cada entrada si no encuentra un objeto igual.
Digamos que hay 10 elementos y no hay un solo objeto como el que desea verificar dentro: en la primera iteración, deepEqual devuelve falso y empuja el elemento; repita este paso y empujará 10 veces el mismo elemento, y arr.length ahora es 20, por lo que habrá 10 iteraciones más donde deepEqual devuelve verdadero y no empuja un nuevo objeto.
Ahora solo imagina lo mismo con 20000 elementos.
Simplemente debe verificar si existe en la matriz, LUEGO eventualmente presionarlo. Intente reemplazar lo anterior con la siguiente solución:
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); }