Actualmente estoy trabajando en un bot de holgura. El propósito es que se seleccionará un desarrollador para una actualización todos los días a las 8 am. Actualmente estoy tratando de descubrir cómo evitar una ejecución cuando alguien está ausente.
var result_arr = []; function setValue (value) { result_arr = Object.values(JSON.parse(JSON.stringify(value))); return result_arr; } db.connect(function(err) { db.query("SELECT * FROM developers", (err, result, fields) => { if (err) { console.log(err); } else { // selected = all.map(item => item.selected); setValue(result); removeMax(); } }) })Resultado de result_arr
rows [ { id: 5, name: 'wqeqwe', selected: 13, absent: 1 }, { id: 7, name: 'weqe', selected: 3, absent: 1 }, { id: 8, name: 'me', selected: 13, absent: 1 }, { id: 9, name: 'joe', selected: 18, absent: 0 }, { id: 10, name: 'tim', selected: 3, absent: 0 } ]La función RemoveMax eliminará el seleccionado más alto (8) y barajará los otros (1, 3, 4, 6), luego capturará uno aleatorio
function removeMax() { const max = Math.max(result_arr.map(item => item.selected)); newArr = result_arr.filter(item => item.selected !== max) shufflearray = newArr[Math.floor(Math.random()*newArr.length)]; setShuffle(shufflearray); hello(); }Esto está conectado con RemoveMax, pero como es asíncrono, tengo que hacerlo global para agregarlo a otra función.
var result_shuffle = []; function setShuffle (shufflearray) { result_shuffle = shufflearray; return result_shuffle }El barajador ha elegido un Seleccionado al azar.
result_shuffle { id: 5, name: 'wqeqwe', selected: 13, absent: 1 }Llegando a la pregunta. wqeqwe está ausente hoy, por lo tanto, la ejecución debe cancelarse; sin embargo, todavía quiero que se seleccione a alguien que NO esté ausente y que el código vuelva a ejecutarse. ¿Cómo hago esto?
function hello() { console.log("1", result_shuffle); console.log("2", result_shuffle.absent); if (shufflearray.absent == 1) { const baddy = "urbad" } else (shufflearray) => { var sql = `UPDATE developers SET selected = ${result_shuffle.selected} + 1 WHERE id = ${result_shuffle.id}`; db.query(sql, function (err, result) { if (err) throw err; console.log(result.affectedRows + " record(s) updated"); }); } }Solo lo filtras. Ya lo está haciendo, solo necesita filtrarlo dos veces, una vez para cada condición.
Pero primero, Math.max espera una entrada diferente. Deberá distribuir esa matriz antes de que funcione. Y luego acabo de agregar un segundo filtro al mapeo newArr para eliminar a todos los que están ausentes.
const result_arr = [ { id: 5, name: 'wqeqwe', selected: 13, absent: 1 }, { id: 7, name: 'weqe', selected: 3, absent: 1 }, { id: 8, name: 'me', selected: 13, absent: 1 }, { id: 9, name: 'joe', selected: 18, absent: 0 }, { id: 10, name: 'tim', selected: 3, absent: 0 } ]; const max = Math.max(...result_arr.map(item => item.selected)); let newArr = result_arr.filter(item => item.selected !== max) .filter(item => !item.absent); console.log(newArr); Pero también debe filtrar a las personas ausentes del cálculo máximo, creo, en caso de que una de las personas ausentes tenga la selección más alta, así que también agregué el filtro ausente allí. Además, ten en cuenta que si joe (18) estuviera ausente y wqeqwe y me (13) no, tanto wqeqwe como me serían eliminados, ya que tienen el mismo seleccionado.
const result_arr = [ { id: 5, name: 'wqeqwe', selected: 13, absent: 1 }, { id: 7, name: 'weqe', selected: 3, absent: 1 }, { id: 8, name: 'me', selected: 13, absent: 1 }, { id: 9, name: 'joe', selected: 18, absent: 0 }, { id: 10, name: 'tim', selected: 3, absent: 0 } ]; const max = Math.max( ...result_arr.filter(item => !item.absent) .map(item => item.selected) ); let newArr = result_arr.filter(item => item.selected !== max) .filter(item => !item.absent); console.log(newArr);Luego, simplemente mezcla esa matriz filtrada con la función de reproducción aleatoria.
También puede combinar ambas condiciones en el primer filtro:
const result_arr = [ { id: 5, name: 'wqeqwe', selected: 13, absent: 1 }, { id: 7, name: 'weqe', selected: 3, absent: 1 }, { id: 8, name: 'me', selected: 13, absent: 1 }, { id: 9, name: 'joe', selected: 18, absent: 0 }, { id: 10, name: 'tim', selected: 3, absent: 0 } ]; const max = Math.max( ...result_arr.filter(item => !item.absent) .map(item => item.selected) ); let newArr = result_arr.filter( item => item.selected !== max && !item.absent ); console.log(newArr);