Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

124
Visualizações
¿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 Respostas
Responde à pergunta

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 Relatório

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda