JSFiddle - React, Tailwind, and code Playground

by neonDog

JavaScript

const catalog = [
  {
    id: 60,
    price: 35,
    label: "Xmas solo",
    description: "This is a solo video featuring Christmas and dildo scenes. Find out why I'm santa's #1 elf",
    category: "solo"
  }
];

const message = {
  content: "Do you like Christmas? Find out why I'm santa's #1 elf in this solo video",
  price: 30
};

function extractWords(text) {
  return text.toLowerCase().match(/\b\w+\b/g);
}

function jaccardSimilarity(set1, set2) {
  const intersection = set1.filter(word => set2.includes(word));
  const union = [...new Set([...set1, ...set2])];
  return intersection.length / union.length;
}

function matchMedia(catalog, message, minSimilarity = 0.1, maxPriceDiff = 0.2) {
  const messageWords = extractWords(message.content);
  const messagePrice = message.price;

  let matches = [];

  for (const media of catalog) {
    const mediaWords = extractWords(media.description);
    const similarity = jaccardSimilarity(messageWords, mediaWords);
    
    if (similarity >= minSimilarity) {
      const priceDifference = Math.abs(media.price - messagePrice) / media.price;
     	if (priceDifference <= maxPriceDiff) {
     		matches.push({ media, similarity, priceDifference });
      }
    }
  }
	
  console.log(matches);
  
  matches.sort((a, b) => {
    if (b.similarity !== a.similarity) {
      return b.similarity - a.similarity;
    }
    return a.priceDifference - b.priceDifference;
  });

  return matches.length > 0 ? matches[0].media : null;
}

// Find the best match with a minimum similarity of 0.2
const bestMatch = matchMedia(catalog, message, 0.2);

console.log("Best Match:", bestMatch);