J'ai un objet avec un utilisateur donné.

const user = [{ id: '1', city: 'Paris', cuisine: 'italian', allergic: 'no', budget: '50', hasChildren: 'yes' }]

Et un éventail d'objets avec des restaurants. Je veux trouver à cet utilisateur un restaurant qui correspond le mieux à ses besoins.

const restaurants: [
 {
  cuisine: 'mexican',
  averageCost: '30',
  children: 'no'
 },
 {
  cuisine: 'italian',
  averageCost: '30',
  children: 'yes'
 }
]

Le deuxième restaurant est donc plus adapté à l'utilisateur, il devrait donc apparaître comme le premier. Chaque clé doit avoir un certain poids, car par exemple la cuisine est plus importante que le coût, elle devrait donc avoir un score plus élevé. Comment puis-je y parvenir? Y a-t-il un algorithme qui fait cela en JavaScript?

-2
Andrew 4 nov. 2019 à 23:26

2 réponses

J'ai donné une implémentation simple ci-dessous. L'idée est de créer un scoring function pour vos restaurants qui dépend du user data et du restaurant data. Ensuite, triez vos restaurants en utilisant cette fonction comme score pour le restaurant. Score descendant pour obtenir les restaurants les plus "les plus proches" au sommet.

Vous pouvez attribuer des poids aux scores à votre guise.

// Given
const restaurants = [
 {
  cuisine: 'mexican',
  averageCost: '30',
  children: 'no'
 },
 {
  cuisine: 'italian',
  averageCost: '30',
  children: 'yes'
 }
];

const user = [{ id: '1', city: 'Paris', cuisine: 'italian', allergic: 'no', budget: '50', hasChildren: 'yes' }];


const calculateScore = (user, restaurant) => {
    // you can fine tune the values for the weights yourself

    // asume that children score gives 1
    const childrenScore = (user.hasChildren === restaurant.children) ? 1 : 0;

    // asume that cuisine score gives 1
    const cuisineScore = (user.cuisine === restaurant.cuisine) ? 1 : 0;

    // asume that cost score gives the absolute difference
    const costScore = Math.abs(parseInt(restaurant.averageCost) - parseInt(user.budget));

    return childrenScore + cuisineScore + costScore;
}

const sortedRestaurants = restaurants.sort((rA, rB) => {
    const rAScore = calculateScore(user[0], rA);
    const rBScore = calculateScore(user[0], rB);
    return rBScore - rAScore; // sort DESC by score
});

console.log(sortedRestaurants)
0
ssBarBee 4 nov. 2019 à 20:42

Voici un extrait rapide de quelque chose que vous pourriez faire.

const user = [{ id: '1', city: 'Paris', cuisine: 'italian', allergic: 'no', budget: '50', hasChildren: 'yes' }];
const restaurants = [
    {
     cuisine: 'mexican',
     averageCost: '30',
     children: 'no'
    },
    {
     cuisine: 'italian',
     averageCost: '30',
     children: 'yes'
    }
]

const orderedRestaurants = restaurants.map(r => {
    return {
        ...r,
        score: 0 +
        (r.cuisine === user[0].cuisine ? 4 : 0) +
        (r.averageCost <= user[0].budget ? 8 : 0) +
        (r.children === 'no' && user[0].hasChildren === 'yes' ? 0 : 3)
    }
}).sort((a,b) => b.score - a.score);

console.log(orderedRestaurants);

Nous devons donc attribuer à chaque restaurant une note basée sur certains critères. J'ai attribué les poids dans la fonction, vous pouvez éventuellement déplacer cet extérieur vers un objet pour une notation dynamique.

Dans cet exemple, nous leur donnons 4 points si la cuisine correspond à l'intérêt de l'utilisateur, en attribuant 8 points si le coût moyen est inférieur ou égal au budget, et en attribuant 3 points si l'utilisateur a des enfants et que le restaurant autorise les enfants. N'hésitez pas à modifier le système de notation à votre guise, mais j'espère que cela pourra vous aider à démarrer.

0
Jon Warren 4 nov. 2019 à 20:43