> is nearly always a perfect fit for this

The fact that it is so close to being useful, but has silly surprises like
`'toString' in everyObject`, actually gives JS a bad reputation and
contributes towards people being driven to other languages that have
cleaner approaches to data types.

On 13 August 2017 at 20:07, Naveen Chawla <naveen.c...@gmail.com> wrote:

> Object self-promotes because it is nearly always a perfect fit for this:
> great performance, great literal syntax, concise access syntax. The only
> compelling case to use a map instead is when insertion ordering is
> required, despite the MDN article. I wouldn't oppose an equivalent
> `Array.prototype.toMap` and `Map.fromIterable`, I would just hardly ever
> use it
>
> On Sun, 13 Aug 2017, 10:33 p.m. Alexander Jones, <a...@weej.com> wrote:
>
>> Honestly, promoting the use of Object for this, and coupling the solution
>> to Array, feels like the wrong direction for the language to me personally.
>> By definition, such a map constructed from a set of homogenous values, for
>> indexing purposes, has a clear key and value type. This guidance from MDN
>> seems to be the right message we should be sending to developers:
>>
>> https://developer.mozilla.org/en/docs/Web/JavaScript/
>> Reference/Global_Objects/Map
>>
>> > ... ask yourself the following questions:
>> >
>> >  * Are keys usually unknown until run time? Do you need to look them up
>> dynamically?
>> >  * Do all values have the same type? Can they be used interchangeably?
>> >  * Do you need keys that aren't strings?
>> >  * Are key-value pairs frequently added or removed?
>> >  * Do you have an arbitrary (easily changing) number of key-value pairs?
>> >  * Is the collection iterated?
>> >
>> > If you answered 'yes' to any of those questions, that is a sign that
>> you might want to use a Map. Contrariwise, if you have a fixed number of
>> keys, operate on them individually, or distinguish between their usage,
>> then you probably want to use an Object.
>>
>>
>> On 13 August 2017 at 05:49, Naveen Chawla <naveen.c...@gmail.com> wrote:
>>
>>> Verbosity.
>>>
>>> It's a task common across many project types and involves only 2
>>> fundamental types in ES: array and object
>>>
>>> Compare:
>>>
>>> ```
>>> const cache = array.reduce((cache, element)=>{cache[element.id] =
>>> element; return cache;}, {});
>>> ```
>>>
>>> with
>>>
>>> ```
>>> const cache = array.toObject(element=>element.id);
>>> ```
>>>
>>> since the signature would offer additional optional `valueFromElement`
>>> and `startingObject` parameters nobody loses anything.
>>>
>>> On Sun, 13 Aug 2017 at 09:51 Barret Furton <barretfur...@gmail.com>
>>> wrote:
>>>
>>>> Why not embrace `Array.prototype.reduce` instead of trying to abstract
>>>> it away?
>>>>
>>>> ```js
>>>> const identity = a => a
>>>>
>>>> const toObject = (fk, fv = identity) =>
>>>>     (acc, curr) => (acc[fk(curr)] = fv(curr), acc)
>>>>
>>>> const arr = [['a', '1'], ['b', '2'], ['c', '3']]
>>>>
>>>> arr.map(a => [a[0], parseInt(a[1], 10)])
>>>>    .filter(a => a[0] !== 'c')
>>>>    .reduce(toObject(a => a[0]), {}) // { a: 1, b: 2 }
>>>> ```
>>>>
>>>> `reduce(toObject)` clearly communicates intent, and you can even
>>>> provide an existing object for merging.
>>>>
>>>> On Sat, Aug 12, 2017 at 1:58 PM, Naveen Chawla <naveen.c...@gmail.com>
>>>> wrote:
>>>>
>>>>> My proposal was `Map.fromIterable(iterable, keyFromElement[,
>>>>> valueFromElement[, existingMap]])` so it's not meant to be symmetrical 
>>>>> with
>>>>> `values` anyway. It was as an equivalent of `Object.fromIterable(iterable,
>>>>> keyFromElement[, valueFromElement[, existingObjectToUse]])` as a means to
>>>>> construct an object's keys and values from any iterable.
>>>>>
>>>>> I also was just thinking that both can perfectly coexist with
>>>>> `Array.prototype.toObject(keyFromElement[, valueFromElement])` which
>>>>> has the advantage of chain-ability after array transformation methods 
>>>>> (like
>>>>> `filter` etc.). Array is such a fundamental construct that I would find
>>>>> myself using this one the most frequently
>>>>>
>>>>> On Sat, 12 Aug 2017 at 21:44 Alexander Jones <a...@weej.com> wrote:
>>>>>
>>>>>> `Map.fromIterable` takes an iterable of values, and a key function.
>>>>>> Would a `Map.prototype.toIterable` return only the values - that's 
>>>>>> already
>>>>>> `Map.prototype.values`? It feels like there is a symmetry issue here.
>>>>>> Perhaps this could be `Map.fromValues`?
>>>>>>
>>>>>> Worth also remembering that compressing every possible use case down
>>>>>> to an absolute minimum has a cost if the resultant language has too many
>>>>>> features like this. I think `new Map(...kvps)` is a general solution that
>>>>>> is actually good enough for "indexing" purposes, and means that people 
>>>>>> only
>>>>>> have to internalise one method of construction via iterables.
>>>>>>
>>>>>> That said, a helper function to allow constructing map-like objects
>>>>>> from arbitrary iterables would maybe be a bit more composable?
>>>>>>
>>>>>> ```js
>>>>>> // This works with Map, WeakMap, Immutable.Map, etc.
>>>>>> function* keyedBy(iterable, keyFn) {
>>>>>>   for (const element of iterable) {
>>>>>>     yield [keyFn(element), element];
>>>>>>   }
>>>>>> }
>>>>>>
>>>>>> const allThePeople = [{name: "Joe", age: 24}, {name: "Barbara", age:
>>>>>> 43}, ...];
>>>>>>
>>>>>> const index1 =
>>>>>>   new Map(keyedBy(allThePeople, _ => _.name));
>>>>>>
>>>>>> // c.f.
>>>>>> const index2 =
>>>>>>   Map.fromValues(allThePeople, _ => _.name);
>>>>>> ```
>>>>>>
>>>>>> On 11 August 2017 at 10:26, Naveen Chawla <naveen.c...@gmail.com>
>>>>>> wrote:
>>>>>>
>>>>>>> Of these, insertion ordering is the only one that may be compelling
>>>>>>> enough to me when I require that, to overcome the disadvantages. I never
>>>>>>> use the object prototype and I'm not convinced about the performance
>>>>>>> aspect. I reiterate though that `Map.fromIterable(allThePeople,
>>>>>>> person=>person.name)` is less verbose for the stated use case
>>>>>>>
>>>>>>> On Fri, 11 Aug 2017 at 11:55 Darien Valentine <valentin...@gmail.com>
>>>>>>> wrote:
>>>>>>>
>>>>>>>> @Alexander The idea of a generalized `map` function (etc, I’m
>>>>>>>> guessing) is
>>>>>>>> appealing. From the way you talked about it, it sounds like there
>>>>>>>> may have been
>>>>>>>> past discussion on the topic. Are there any proposals for this or
>>>>>>>> major ideas
>>>>>>>> being batted around?
>>>>>>>>
>>>>>>>> > Why? What's the advantage? You lose at least the square bracket
>>>>>>>> and dot
>>>>>>>> > notations for access, as disadvantages, and I'm not aware of any
>>>>>>>> advantages.
>>>>>>>> > If there aren't any that compensate for the disadvantages, then
>>>>>>>> it's a net
>>>>>>>> > negative
>>>>>>>>
>>>>>>>> @Naveen — a handful of things. Objects are indeed a perfectly
>>>>>>>> reasonable choice
>>>>>>>> for modeling kvp collections a lot of the time. On the other hand,
>>>>>>>> because
>>>>>>>> objects in ES serve double duty as ways to model data and ways to
>>>>>>>> "model code",
>>>>>>>> they are not always ideal for the former case on account of the
>>>>>>>> features that
>>>>>>>> exist mainly to serve the second. Some examples of things that make
>>>>>>>> maps useful:
>>>>>>>> inherently iterable; no prototype chain access lookup; no collision
>>>>>>>> with
>>>>>>>> `Object.prototype` property name when hashing by arbitrary keys;
>>>>>>>> potentially
>>>>>>>> more efficient for situations where keys are frequently removed;
>>>>>>>> `map.has()` is
>>>>>>>> more straightforward than having to consider whether you want `key
>>>>>>>> in` or
>>>>>>>> `Object.hasOwnProperty` or which properties have been defined as
>>>>>>>> enumerable or
>>>>>>>> not; iteration order of entries is 1:1 with insertion order; and of
>>>>>>>> course, keys
>>>>>>>> can be of any type. Further, maps can be subclassed to constrain
>>>>>>>> the types that
>>>>>>>> they may hold or add other behaviors without needing to define
>>>>>>>> custom Proxies.
>>>>>>>>
>>>>>>>> Some general use cases: registries; hashing data where keys are
>>>>>>>> from external
>>>>>>>> input; kvp collections which are ordered; kvp collections which
>>>>>>>> will be subject
>>>>>>>> to later transformations; kvp collections to which new keys are
>>>>>>>> frequently added
>>>>>>>> or removed.
>>>>>>>>
>>>>>>>> While I hope that information is somewhat helpful, there are
>>>>>>>> probably much more
>>>>>>>> detailed resources online (including, I suspect, past discussions
>>>>>>>> on this list)
>>>>>>>> which could explain some of those things better or which include
>>>>>>>> cases I haven’t
>>>>>>>> thought of.
>>>>>>>> _______________________________________________
>>>>>>>> es-discuss mailing list
>>>>>>>> es-discuss@mozilla.org
>>>>>>>> https://mail.mozilla.org/listinfo/es-discuss
>>>>>>>>
>>>>>>>
>>>>>>> _______________________________________________
>>>>>>> es-discuss mailing list
>>>>>>> es-discuss@mozilla.org
>>>>>>> https://mail.mozilla.org/listinfo/es-discuss
>>>>>>>
>>>>>>>
>>>>>>
>>>>> _______________________________________________
>>>>> es-discuss mailing list
>>>>> es-discuss@mozilla.org
>>>>> https://mail.mozilla.org/listinfo/es-discuss
>>>>>
>>>>>
>>>>
>>
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to