// 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; };