Como se muestra a continuación, si me gustaría saber si un objeto en testArray está en currentArray, puedo usar for loop para atravesar matrices, o puedo usar find()
, some()
, include()
. El peor rendimiento es si todos caen al menos una vez en O (n ^ 2).
Si primero filtro los elementos en currentArray cuyo saldo no es 999 o 999.999 y luego verifico testArray. ¿El rendimiento es mejor que caer al menos una vez? ¿O hay alguna forma de hacerlo mejor?
¡Gracias!
let currentArray = [ {account: 1, balance: 200}, {account: 2, balance: 100}, {account: 3, balance: 300}, {account: 4, balance: 999}, {account: 5, balance: 999.999}, {account: 6, balance: 999}, {account: 15, balance: 999.999}, {account: 8, balance: 100}, {account: 9, balance: 300}, {account: 10, balance: 300}, ] let testArray = [ {account: 4, balance: 999}, {account: 5, balance: 999.999}, {account: 6, balance: 999}, {account: 7, balance: 999.999}, {account: 8, balance: 999}, {account: 9, balance: 999.999}, {account: 10, balance: 999}, {account: 11, balance: 999.999}, {account: 12, balance: 999}, {account: 13, balance: 999.999}, {account: 14, balance: 999}, {account: 15, balance: 999.999}, ]
Por lo que entiendo, espera el siguiente resultado para las matrices de ejemplo dadas:
[ { "account": 4, "balance": 999 }, { "account": 5, "balance": 999.999 }, { "account": 6, "balance": 999 }, { "account": 15, "balance": 999.999 } ]
... ya que estos ocurren en ambas matrices.
Para lograr eso con una mejor complejidad de tiempo, use una clave única para cada objeto. Sabiendo que sus objetos tienen una clave que consta de dos propiedades, puede combinar esos dos valores en una matriz y producir su codificación JSON (o cualquier otra codificación adecuada): esa cadena será una identificación única para cada objeto. Almacene los de la primera matriz en un conjunto y luego itere la segunda matriz para verificar si el objeto tiene un identificador de este tipo que ocurre en el conjunto.
let currentArray = [ {account: 1, balance: 200}, {account: 2, balance: 100}, {account: 3, balance: 300}, {account: 4, balance: 999}, {account: 5, balance: 999.999}, {account: 6, balance: 999}, {account: 15, balance: 999.999}, {account: 8, balance: 100}, {account: 9, balance: 300}, {account: 10, balance: 300}, ]; let testArray = [ {account: 4, balance: 999}, {account: 5, balance: 999.999}, {account: 6, balance: 999}, {account: 7, balance: 999.999}, {account: 8, balance: 999}, {account: 9, balance: 999.999}, {account: 10, balance: 999}, {account: 11, balance: 999.999}, {account: 12, balance: 999}, {account: 13, balance: 999.999}, {account: 14, balance: 999}, {account: 15, balance: 999.999}, ]; const hash = ({account, balance}) => JSON.stringify([account, balance]); let ref = new Set(currentArray.map(hash)); let result = testArray.filter(obj => ref.has(hash(obj))); console.log(result);
Si solo está interesado en saber si existe tal objeto, entonces use some
en lugar de filter
. El valor devuelto será un valor booleano: verdadero cuando existe tal objeto y falso en caso contrario.
Si está interesado en encontrar uno de esos objetos, use find
en lugar de filter
. El valor de retorno será el primer objeto encontrado, o undefined
cuando no exista tal objeto.
La clave para mejorar la complejidad del tiempo es el uso del Set
. También podría ser un objeto simple con las cadenas JSON como nombres de propiedad y, para cada uno, un valor arbitrario (como true
).