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);