I have created, or am creating, a function that will take an array with arbitrary values, and return an object of the format {array_value1: count2, array_value2: count2, ...}.
Is it possible to override or extend the default get attribute of the object, such that I can return a value or run a function when another piece of code accesses a key that does not exist within the object? Eg. if someone tries to access return_object[key_does_not_exist], can I modify the getter such that the object does not return a value of null, but rather returns 0?
I know you can cetainly modify the getter, but it doesn't seem there is the ability to modify what happens when a non-existent property is accessed -- I know Ruby has this ability (and it is IIRC fairly widely used). Is there a way to do this that I haven't found?
Specific problem below
Task: count a number of tickets contained in an array of the following form,
const tickets = [
  'red',
  'red',
  'green',
  'blue',
  'green'
]
and return the count in the following format:
{
  red: 2,
  green: 2,
  blue: 1
}
The function I have thus far:
const countTickets = (tickets) => {
  let ret_obj = {};
  // I did not include this initially, which I think should be fine
  ret_obj["red"] = 0
  ret_obj["green"] = 0
  ret_obj["blue"] = 0
  for (let ticket of tickets) {
    if (ret_obj.hasOwnProperty(ticket)) {
      ret_obj[ticket] += 1;
    } else {
      ret_obj[ticket] = 1;
    }
  }
  return ret_obj;
}
