my code works with the map ,m, until i use it on the event listener clicking the button, after that is throws an error and tells me m.get() is not a function, however works prior to the click event, what can i do to fix this and why is this happening??
'use strict';
const poll = {
question: 'What is your favourite programming language?',
options: ['0: JavaScript', '1: Python', '2: Rust', '3: C++'],
// This generates [0, 0, 0, 0]. More in the next section 😃
answers: new Array(4).fill(0),
registerNewAnswer(m){
const answer = Number(prompt(`${this.question}\n${this.options.join('\n')}`));
answer < 4 && answer >= 0 ? answer : alert('invalid entry try again');
//console.log(answer);
m.set(this.options[answer],m.get(poll.options[answer]) + 1)
}
}
const fun = function(arr){
let narr =[];
for(let i =0;i<arr.length;i++){
let temp = [];
temp.push(arr[i]);
temp.push(0);
narr.push(temp);
}
return narr;
}
const m = new Map(fun(poll.options));
const pollPrompt = poll.registerNewAnswer.bind(poll);
pollPrompt(m);
document.querySelector('.poll').addEventListener('click',poll.registerNewAnswer.bind(poll));
Issue is when the callback is run on click, m points to the HTMLDOMNode and not map
You can do the following:
const poll = {
question: 'What is your favourite programming language?',
options: ['0: JavaScript', '1: Python', '2: Rust', '3: C++'],
// This generates [0, 0, 0, 0]. More in the next section 😃
answers: new Array(4).fill(0),
registerNewAnswer(m){
console.log('m', m);
const answer = Number(prompt(`${this.question}\n${this.options.join('\n')}`));
answer < 4 && answer >= 0 ? answer : alert('invalid entry try again');
//console.log(answer);
m.set(this.options[answer],m.get(poll.options[answer]) + 1)
}
}
const fun = function(arr){
let narr =[];
for(let i =0;i<arr.length;i++){
let temp = [];
temp.push(arr[i]);
temp.push(0);
narr.push(temp);
}
return narr;
}
const m = new Map(fun(poll.options));
const pollPrompt = poll.registerNewAnswer.bind(poll);
pollPrompt(m);
document.querySelector('.poll').addEventListener('click', () => {
poll.registerNewAnswer(m)
});