49 lines
1.5 KiB
JavaScript
49 lines
1.5 KiB
JavaScript
// utils/filterProperties.js
|
|
import Fuse from 'fuse.js';
|
|
|
|
export const filterSimilarProperties = (properties) => {
|
|
const options = {
|
|
keys: ['title'], // Solo buscamos similitud en el título
|
|
threshold: 0.6, // 0.6 es un umbral para 40% de similitud
|
|
includeScore: true // Incluye la puntuación de similitud
|
|
};
|
|
|
|
const fuse = new Fuse(properties, options);
|
|
const uniqueProperties = [];
|
|
const seen = new Set(); // Usaremos un conjunto para rastrear propiedades vistas
|
|
|
|
properties.forEach((property) => {
|
|
if (!seen.has(property.id)) {
|
|
// Buscamos propiedades similares por título
|
|
const result = fuse.search(property.title).filter((res) => {
|
|
// Filtramos resultados que no sean la misma propiedad y sean similares en título
|
|
return res.item.id !== property.id && res.score < options.threshold;
|
|
});
|
|
|
|
// Comprobamos coincidencia exacta en price, rooms y area
|
|
const matchingProperties = result.filter((res) => {
|
|
const item = res.item;
|
|
return (
|
|
item.price === property.price &&
|
|
(item.rooms === property.rooms ||
|
|
item.area === property.area)
|
|
);
|
|
});
|
|
|
|
if (matchingProperties.length === 0) {
|
|
uniqueProperties.push(property);
|
|
}
|
|
|
|
// Marcar propiedades similares como vistas
|
|
matchingProperties.forEach((res) => {
|
|
seen.add(res.item.id);
|
|
});
|
|
|
|
// Añadir la propiedad actual como vista
|
|
seen.add(property.id);
|
|
}
|
|
});
|
|
|
|
return uniqueProperties;
|
|
};
|