Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

120
Vistas
¿Cómo clasifico la matriz por números y también evito que aumente más de 15 y tome solo los números más grandes?

aquí está mi código por ahora:

 router.get('/questions/best', function(req,res,next){ Question.find({}).exec(function(err,results){ if (err){return next(err)} let top15 = []; for(let i = 0; i< results.length; i++){ let dislikestouse = results[i].dislikes[0] let ratio = 0 if(dislikestouse > 0){ ratio = results[i].likes[0]/dislikestouse } else{ ratio = results[i].likes[0]/1 } } res.render('content', { whichOne: 5, user: req.user, questions: top15 }); }) });

resultados es cada pregunta en la base de datos, y se supone que top15 son solo las que se muestran, ya que tienen la proporción más alta y se representan en la plantilla. Intenté usar declaraciones if para evitar que se divida por 0, ya que da como resultado un error.

¿Cómo clasifico cada resultado buscando si es más grande que cualquiera de los elementos en top15 y luego colocándolo en el lugar correcto si lo es? Yo uso JavaScript puro. para acceder a los números de los gustos y aversiones de un resultado, busque el primer elemento, ya que es donde almaceno la longitud, como una matriz típica de Me gusta: [2,'username1', 'username2'] . aquí está el esquema para una pregunta:

 const Question = mongoose.model( "Question", new Schema({ title: { type: String, required: true }, text: { type: String }, authorUsername: { type: String, required: true }, dateCreated: {}, answers: { type: Array, required: true }, likes: { type: Array, required: true }, dislikes: { type: Array, required: true }, tag: { type: String, required: true }, views: {type: Array, required:true}, }) );

aquí hay un ejemplo de una pregunta:

 _id:620935985f6865b4e85c333d title:"How do i make a lemon?" text:"yeet" authorUsername:"SweetWhite" dateCreated:2022-02-13T16:45:12.598+00:00 answers: Array likes: Array 0:1 1:"SweetWhite" dislikes: Array 0:0 tag: "Social" views: Array 0:1 1:"SweetWhite" __v:0

¡Gracias!

about 4 years ago · Juan Pablo Isaza
3 Respuestas
Responde la pregunta

0

Podrías usar métodos de matriz:

ordenar: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

segmento: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice

mapa: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map

Aquí hay un fragmento que probé para su problema:

 function sortQuestions(results) { const questionsWithRatio = results.map((result) => ({ ...result, ratio: result.likes[0] / Math.max(result.dislikes[0], 1), })); // console.log(questionsWithRatio); const top15 = questionsWithRatio .sort((a, b) => b.ratio - a.ratio) .slice(0, 15); console.log(top15); }
about 4 years ago · Juan Pablo Isaza Denunciar

0

La respuesta anterior es una excelente solución de Javascript puro. Sin embargo, podría darse el caso de que no queramos arrastrar miles o posiblemente más elementos fuera de la base de datos solo para ordenar y elegir 15 en el lado del cliente. Dado un conjunto de documentos como este:

 var r = [ {likes: ['A','A'], dislikes: ['A','A']}, {likes: ['A','A']}, {dislikes: ['A','A']}, {likes: ['A','A','A','A','A'], dislikes: ['A','A']}, {likes: ['A','A','A','A','A','A','A','A','A'], dislikes: ['A','A']}, {likes: ['A','A','A','A','A','A','A','A'], dislikes: ['A','A']}, {likes: ['A','A','A','A','A','A','A'], dislikes: ['A','A']}, {likes: ['A'], dislikes: ['A','A']} ];

Luego, aquí hay una agregación que impulsará la lógica de clasificación y "segmentación" en la base de datos:

 db.foo.aggregate([ // Protect against missing fields with $ifNull // Protect against division by zero dislikes using max[1,size] {$addFields: {ratio: {$divide:[{$size:{$ifNull:["$likes",[]]}}, {$max:[1,{$size:{$ifNull:["$dislikes",[]]}}]} ]} }}, {$sort: {ratio:-1}}, {$limit: 3} // change to 15 for the real dataset ]);

Si debemos acomodar la naturaleza de "codificación de longitud de ejecución" de los arreglos, por ejemplo [2, 'user1', 'user2'] entonces el agregado es muy similar solo usando $arrayElemAt para tomar el arreglo[0] en lugar de usar $size :

 var r = [ {likes: [2, 'A','A'], dislikes: [2, 'A','A']}, {likes: [2, 'A','A']}, {dislikes: [2, 'A','A']}, {likes: [5, 'A','A','A','A','A'], dislikes: [2, 'A','A']}, {likes: [9, 'A','A','A','A','A','A','A','A','A'], dislikes: [2, 'A','A']}, {likes: [8, 'A','A','A','A','A','A','A','A'], dislikes: [2, 'A','A']}, {likes: [7, 'A','A','A','A','A','A','A'], dislikes: [2, 'A','A']}, {likes: [1, 'A'], dislikes: [2, 'A','A']} ]; db.foo.aggregate([ // Protect against missing fields with $ifNull but this time it is not // an empty array [] but rather an array of one elem, the length, which // is 0: {$project: {ratio: {$divide:[ {$arrayElemAt:[{$ifNull:["$likes",[0]]}, 0]}, {$max:[1, {$arrayElemAt:[{$ifNull:["$dislikes",[0]]}, 0]}]} ]} }}, {$sort: {ratio:-1}}, {$limit: 3} ]); { "_id" : 4, "ratio" : 4.5 } { "_id" : 5, "ratio" : 4 } { "_id" : 6, "ratio" : 3.5 }
about 4 years ago · Juan Pablo Isaza Denunciar

0

Antes de intentar ayudar, intente mejorar la legibilidad de su código. Puede buscar async/await y la sintaxis ES6 para ayudarlo en esto.

Además, si está utilizando un IDE como Visual Studio Code, puede instalar más bonito , que formateará automáticamente sus códigos.

Aquí hay una solución aproximada para usted:

 router.get('/questions/best', function(req,res,next){ Question.find({}).exec(function(err,results){ if (err) return next(err); let top15 = []; // note that the code is slightly more readable already results.forEach(result => { const dislikesToUse = result.dislikes[0] let ratio = 0; if(dislikesToUse > 0) { ratio = result.likes[0]/dislikesToUse } else { ratio = result.likes[0]/1 } // push each result with ratio to top15 top15.push({...result, ratio}) }); // sort top15 by ratio top15.sort((a,b) => b.ratio - a.ratio) // do a.ratio - b.ratio to change order // get only the top 15 top15 = top15.slice(0, 15) res.render('content', { whichOne: 5, user: req.user, questions: top15 }); }) });

NOTA

Esta es solo una forma de hacerlo y podría no ser la forma más eficiente. También debe considerar las funciones agregadas de Mongo.

Definitivamente también debería reconsiderar el diseño de su esquema.

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda