Hola, recientemente me hicieron una pregunta muy interesante: dar un conjunto de datos
data = [{name: "gem1", year: 2013, color:"yellow"}, {name: "gem2", year: 2013, color:"blue"}, {name: "gem3", year: 2021, color:"blue"}]Y un conjunto de filtro
filters = [{k: "color", v: "yellow"}]Mostrar los datos excluidos por filtro como:
getExclusive(data, filters) = [{name: "gem2", year: 2013, color:"blue"}, {name: "gem3", year: 2021, color:"blue"}]Además, el adicional es que, la pregunta misma ha mencionado que un método muy crudo:
filter.forEach(filter => {data = data.filter(datum => {return datum[filter.k] == filter.v})})es DEMASIADO LENTO. Y el propósito es optimizarlo.
Tenga en cuenta que cada objeto en los datos tendrá un número desconocido de claves, y los nombres de las claves también son dinámicos, por ejemplo: obj1 solo puede tener {lastName: "last", firstName: "first"} y obj2 solo puede tener {model : "Jeep", año: 2021, color: "blanco"})
Pensé que la razón por la que es lento es porque la gran O va a F * D
Y quiero convertir los filtros en Map<string, Set> para que para cada dato se vea la ubicación en O(1).
Pero luego descubrí que estaba equivocado. Porque de esta manera necesita pasar por cada clave en cada obj para ver si golpea un filtro. Por lo tanto, se convierte en F + D * <avg key numbers in data> , ¿lo que podría ser aún peor si el número clave es tan grande?
Entonces, ¿hay alguna otra forma de optimizarlo absolutamente, o tal vez esta es solo una pregunta abierta sin una respuesta definitiva?
Tenga en cuenta que esta pregunta está en JavaScript. Así que no sé si se consideraría alguna API interna.