Map.prototype.getOrDefault

Given an array of numbers, I want to build a map in which the key is the number, value is the occurrence time of the number.
Input: [1, 2, 2, 3, 3, 3]
Output: Map(3) {1 => 1, 2 => 2, 3 => 3}

In Java, we could write our program as:

HashMap<Integer, Integer> map = new HashMap<>();
for (int num : nums) {
   map.put(num, map.getOrDefault(num, 0) + num);
}

The key is getOrDefault method on HashMap, see Java API doc for detail: Map (Java Platform SE 8 )

In JavaScript, we could write as:

const map = new Map();
for (const num of nums) {
  map.set(num, (map.get(num) ?? 0) + 1);
};

The javascript version have two problem in my opinion:

  1. map.get(num) ?? 0 is less readable to map.getOrDefault(num, 0)
  2. (map.get(num) ?? 0) + 1 is more prone to mistake

On the first try, I write the following program:

const map = new Map();
for (const num of nums) {
  map.set(num, map.get(num) ?? 0 + 1);
};

If we input [1, 2, 2, 3, 3, 3], the output is Map(3) {1 => 1, 2 => 1, 3 => 1}. This is because map.get(num) ?? 0 + 1 is evaluated as map.get(num) ?? (0 + 1) in javascript.

So I am wondering if we could add Map.prototype.getOrDefault to javascript, so that we could rewrite the above program to:

const map = new Map();
for (const num of nums) {
  map.set(num, map.getOrDefault(num, 0) + 1);
};
1 Like

Hi @F3n67u

It sounds like you would be interested in this existing stage 2 proposal:

How do this work. The proposal has been there for 4 years. is this ever going to get in? what is required for proposals to get into ECMAScript

The TC39 Process documents the stage process all proposals must go through. Stage advancement requires full consensus of the committee.

2 Likes

https://github.com/tc39/proposal-upsert

2 Likes