Map#get needs a default value param?

# Hemanth H.M (13 years ago)

Would it be useful to have something like sum[value] = sum.get(value, 0) + 1

# David Bruant (13 years ago)

Le 12/06/2012 16:19, Hemanth H.M a écrit :

Would it be useful to have something like sum[value] = sum.get(value, 0) + 1

You can always do

 sum[value] = (sum.get(value) || 0) + 1;

I think it's simple enough to justify not having an additional (and potentially confusing) argument, but I'm open to debate.

# Tab Atkins Jr. (13 years ago)

On Tue, Jun 12, 2012 at 7:36 AM, David Bruant <bruant.d at gmail.com> wrote:

Le 12/06/2012 16:19, Hemanth H.M a écrit :

Would it be useful to have something like sum[value] = sum.get(value, 0) + 1

You can always do

sum[value] = (sum.get(value) || 0) + 1;

I think it's simple enough to justify not having an additional (and potentially confusing) argument, but I'm open to debate.

The default argument in python's Dict.get doesn't seem confusing, and I've used it plenty. (I've also used the more specialized Dict variants that obviate it - Counter and DefaultDict.)

# David Bruant (13 years ago)

Le 12/06/2012 18:02, Tab Atkins Jr. a écrit :

On Tue, Jun 12, 2012 at 7:36 AM, David Bruant<bruant.d at gmail.com> wrote:

Le 12/06/2012 16:19, Hemanth H.M a écrit :

Would it be useful to have something like sum[value] = sum.get(value, 0) + 1

You can always do

 sum[value] = (sum.get(value) || 0) + 1;

I think it's simple enough to justify not having an additional (and potentially confusing) argument, but I'm open to debate. The default argument in python's Dict.get doesn't seem confusing, and I've used it plenty. (I've also used the more specialized Dict variants that obviate it - Counter and DefaultDict.) "sum.get(value) || 0" leaves no ambiguity (assuming you know JavaScript and falsy values) as to when the value is 0, while for "sum.get(value, 0)", the implicit part is in the semantics of the function for which you need to look at the spec, that's what I find more confusing. YMMV.

# Hemanth H.M (13 years ago)

True! It will be confusing; || is uber kool :)

# Tab Atkins Jr. (13 years ago)

On Tue, Jun 12, 2012 at 9:07 AM, David Bruant <bruant.d at gmail.com> wrote:

Le 12/06/2012 18:02, Tab Atkins Jr. a écrit :

On Tue, Jun 12, 2012 at 7:36 AM, David Bruant<bruant.d at gmail.com>  wrote:

Le 12/06/2012 16:19, Hemanth H.M a écrit :

Would it be useful to have something like sum[value] = sum.get(value, 0)

  • 1

You can always do

sum[value] = (sum.get(value) || 0) + 1;

I think it's simple enough to justify not having an additional (and potentially confusing) argument, but I'm open to debate.

The default argument in python's Dict.get doesn't seem confusing, and I've used it plenty.  (I've also used the more specialized Dict variants that obviate it - Counter and DefaultDict.)

"sum.get(value) || 0" leaves no ambiguity (assuming you know JavaScript and falsy values) as to when the value is 0, while for "sum.get(value, 0)", the implicit part is in the semantics of the function for which you need to look at the spec, that's what I find more confusing. YMMV.

The problem is that the simple expression works for this example, because we know that if the value is set, it will be set to a non-zero number. Thus, all set values are truthy, and we can rely on undefined being the only falsey value in the map.

In the more general case where the map might legitimately be holding 0, false, or null, this assumption breaks and you have to go with the wordier variant:

var temp = sum.get(value); sum.set(value, temp === undefined ? 1 : temp + 1);

Of course, the default operator would return us to your simpler expression:

sum.set(value, (sum.get(value) ?? 0) + 1;

This isn't too bad, and we can always wait for the language to expand with subtypes of Map that handle this behavior better (or use a library), like the aforementioned Counter and DefaultDict of Python.

# Brendan Eich (13 years ago)

Tab Atkins Jr. wrote:

This isn't too bad, and we can always wait for the language to expand with subtypes of Map that handle this behavior better (or use a library), like the aforementioned Counter and DefaultDict of Python.

Previously: esdiscuss/2012-January/019723 et seq.