Tengo un objeto con un usuario dado.

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

Y una variedad de objetos con restaurantes. Quiero encontrar a este usuario un restaurante que más se adapte a sus necesidades.

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

Así que el segundo restaurante es más adecuado para el usuario, por lo que debe aparecer como el primero. Cada llave debe tener algún peso, porque por ejemplo, la cocina es más importante que el costo, por lo que debe tener una puntuación más grande. ¿Cómo puedo lograrlo? ¿Hay algún algoritmo que haga esto en JavaScript?

-2
Andrew 4 nov. 2019 a las 23:26

2 respuestas

He dado una implementación simple a continuación. La idea es crear un scoring function para sus restaurantes que depende de la user data y la restaurant data. Luego ordenar sus restaurantes utilizando esa función como puntuación para el restaurante. Puntuación descendiente para obtener los restaurantes más "más cercanos" en la parte superior.

Puede asignar pesos a las puntuaciones como desee.

// 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 a las 20:42

Aquí hay un fragmento rápido de algo que podrías hacer.

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

Así que tenemos que asignar a cada restaurante una puntuación basada en ciertos criterios. He asignado los pesos en la función, posiblemente podría mover eso fuera en un objeto para la puntuación dinámica.

En este ejemplo, les estamos dando 4 puntos si la cocina coincide con el interés del usuario, asignando 8 puntos si el coste medio es menor o igual al presupuesto, y asignando 3 puntos si el usuario tiene niños y el restaurante permite a los niños. Siéntase libre de editar el sistema de puntuación como desee, pero espero que esto puede ayudarle a empezar.

0
Jon Warren 4 nov. 2019 a las 20:43
58700565