Array.prototype.toObjectByProperty( element=>element.property )
Naveen Chawla
naveen.chwl at gmail.com
Wed Aug 9 09:08:40 UTC 2017
Hi Jordan, great question.
An iterable of anything!
This is the signature:
```
Object.fromIterable(iterable, keyFromElement[, valueFromElement])
```
Examples follow:
Supposing you had an array:
```
[
{
countryName: 'UK',
population: 65640000
},
{
countryName: 'USA',
population: 323100000
},
{
countryName: 'Denmark',
population: 5731000
}
]
```
...and you wanted to cache the items by country name for quick access, to
get:
```
{
UK: {
countryName: 'UK',
population: 65640000
},
USA: {
countryName: 'USA',
population: 323100000
},
Denmark: {
countryName: 'Denmark',
population: 5731000
}
}
```
...you would simply do
```
const countriesByName = Object.fromIterable(countries,
country=>country.countryName);
```
to get that result. (the 2nd parameter defaults to return the iterated
value if not provided).
As callbacks, the `keyFromElement` and `valueFromElement` parameters allow
you to supply anything you like to transform from the iterated element (or
from elsewhere) into the keys and values you want:
e.g. if you had an array of strings called "recentCountryNames" with
`['UK', 'Denmark']`:
```
const recentCountryDetailsByName = Object.fromIterable(recentCountryNames,
countryName=>countryName, countryName=>countriesByName[countryName])
```
would produce:
```
{
UK: {
countryName: 'UK',
population: 65640000
},
Denmark: {
countryName: 'Denmark',
population: 5731000
}
}
```
As an aside, it can easily transform entries as follows:
`Object.fromIterable(entries, entry=>entry[0], entry=>entry[1])` (if the
entry "keys" happen to be valid object keys, otherwise you can simply
provide a different transformation for the `keyFromElement` callback) but
works equally well with all types of iterables
On Wed, 9 Aug 2017 at 13:55 Jordan Harband <ljharb at gmail.com> wrote:
> I think you're misunderstanding; the function would of course take an
> iterable. However, an iterable of what?
>
> If it's an iterable of objects, then what's the key and what's the value?
> What if it's an iterable of strings?
>
> The only thing that makes sense is if it's an iterable that provides both
> a key and a value - and "entries" is the idiomatic structure in the
> language to respect a list of key/value pairs (besides "an object", of
> course).
>
> What would you suggest?
>
> On Wed, Aug 9, 2017 at 1:08 AM, Naveen Chawla <naveen.chwl at gmail.com>
> wrote:
>
>> It is more generic than `fromEntries`
>>
>> On Wed, 9 Aug 2017 at 13:32 Naveen Chawla <naveen.chwl at gmail.com> wrote:
>>
>>> Iterable to object via `Object.fromIterable`
>>>
>>> On Wed, 9 Aug 2017 at 13:31 Jordan Harband <ljharb at gmail.com> wrote:
>>>
>>>> JS doesn't have interfaces (yet, tho there's a proposal) and
>>>> regardless, the "interface" for "iterable" is "it has Symbol.iterator,
>>>> nothing more".
>>>>
>>>> The only place a method like this - that produces an object - could
>>>> possibly exist, is a static method on Object.
>>>>
>>>> I've already outlined two existing methods to copy one object's entries
>>>> to another; the only new functionality would be "creating an object from
>>>> entries", hence Object.fromEntries or similar.
>>>>
>>>> I still haven't seen any use cases that aren't covered by the existing
>>>> "copy one object to another", or by a possible "entries to object" - does
>>>> anyone have any?
>>>>
>>>> On Wed, Aug 9, 2017 at 12:56 AM, Naveen Chawla <naveen.chwl at gmail.com>
>>>> wrote:
>>>>
>>>>> But I accept that this a very tall order for ES
>>>>>
>>>>> On Wed, 9 Aug 2017 at 13:22 Naveen Chawla <naveen.chwl at gmail.com>
>>>>> wrote:
>>>>>
>>>>>> Java has a great example of such a construct: default interface
>>>>>> methods
>>>>>>
>>>>>> On Wed, 9 Aug 2017 at 13:21 Naveen Chawla <naveen.chwl at gmail.com>
>>>>>> wrote:
>>>>>>
>>>>>>> The `toObject` behaviour doesn't need to be "implemented" on a
>>>>>>> per-iterable class basis. It has a constant behaviour: iterate and on each
>>>>>>> next(), pass the value to the `toKeyFromElement` and `toValueFromElement`
>>>>>>> callbacks to generate and return an object. There must be some construct by
>>>>>>> which that can be achieved. I wouldn't call it "better" to put it on Object
>>>>>>> (for the reasons stated), but rather a compromise in the absence of any
>>>>>>> such construct
>>>>>>>
>>>>>>> On Wed, 9 Aug 2017 at 13:12 T.J. Crowder <
>>>>>>> tj.crowder at farsightsoftware.com> wrote:
>>>>>>>
>>>>>>>> On Wed, Aug 9, 2017 at 8:35 AM, Naveen Chawla <
>>>>>>>> naveen.chwl at gmail.com> wrote:
>>>>>>>> >
>>>>>>>> > It would be in the `iteratable` `protocol` (interface)
>>>>>>>>
>>>>>>>> As Jordan said, that's likely to be a nonstarter. The Iterable
>>>>>>>> protocol is *very* lean (exactly one required property) for a reason: So it
>>>>>>>> can be supported with minimum investment. Much better, IMHO, to put
>>>>>>>> functions on `Object` and `Map` (which is why that's what I suggested).
>>>>>>>>
>>>>>>>> -- T.J. Crowder
>>>>>>>>
>>>>>>>
>>>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20170809/b83eeb77/attachment-0001.html>
More information about the es-discuss
mailing list