So I got a function that executes every X minutes/hours, when it executes it will select a random database array value, when it does, the selected will get + 1. Selected stands for the amount of times the row has been selected.
id: 5 name: tom selected: 17 id: 8 name: tim selected: 12 id: 2 name: tombie selected: 5 id: 3 name: timbie selected: 4
This is my code from which I catch all of my database values
function setValue (value) { console.log("Array", value); result_arr = Object.values(JSON.parse(JSON.stringify(value))); return result_arr; } console.log("arr", 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); console.log("result", result); setValue(result); console.log("value", setValue(result)); removeMax() } })
Lets say if we have Selected: 5, 4, 12 and 17. 17 is the highest selected count, to avoid it gaining more selected points, I ensure the highest numbers is removed from the array. Once the highest number is removed, I shuffle the numbers and it will select a random one.
function removeMax() { const max = Math.max(result_arr.map(item => item.selected)); const newArr = result_arr.map(item => item.selected).filter(number => number !== max); var shufflearray = newArr[Math.floor(Math.random()*newArr.length)]; return shufflearray; }
Lets say from the shuffle I get 5. I now have to add + 1 to this, so 5 must become 6.
In function hi() I have an If statement, everyday at 8 am this code has to be executed. So as I said, I have to update the selected value.
Here comes the question: Usually I would do UPDATE developers SET selected = 6 WHERE id = 2. but since I have multiple rows this wont work. Today It might be Timbie, tommorow It can be Tim. How do I link the selected values with their IDs?
function hi() { window.setInterval(function(){ var date = new Date(); if (date.getHours() === 8 && date.getMinutes() === 0) { if (test) { db.query( `UPDATE developers SET selected = ? WHERE id = ${item.id} `,[selected, id], (err, result) => { if (err) { console.log(err); } else { res.send(result); } }); } } else { const abort = "abort" } }, 60000); }
Advertisement
Answer
In the function removeMax(), the data is reduced to become just a list of the selected values. You would need to keep each item, not only the number of times it is selected.
Original code:
function removeMax() { const max = Math.max(result_arr.map(item => item.selected)); const newArr = result_arr.map(item => item.selected).filter(number => number !== max); var shufflearray = newArr[Math.floor(Math.random()*newArr.length)]; return shufflearray; }
Original result:
var result_arr = [{'id': 1, 'selected': 10}, {'id': 2, 'selected': 5}, {'id': 3, 'selected': 15}, {'id': 4, 'selected': 7}] newArr = result_arr.map(item => item.selected) resulting newArr: [10, 5, 15, 7]
After that, you are removing the largest value. Notice how all the id’s are gone?
If you instead do:
newArr = result_arr.filter(item => item.selected !== max) resulting newArr: [{id: 1, selected: 10}, {id: 2, selected: 5}, {id: 4, selected: 7}]
Now that you have an array of objects, you can rearrange them as before, and afterwards access the # of selected with item.selected, and each id with item.id.