Comprehensions are a really useful feature of Python that aren't available in JavaScript (or many languages).
These concepts of course can be tranlsated into using map instead. But especially the dictionaries are a bit
trickier.
This one is easy as they translate very simply to map.
>>> foobar = range(5)
>>> [x + 1 for x in foobar]
[1, 2, 3, 4, 5]
# Intermediate translation
>>> map(lambda x: x + 1, foobar)
[1, 2, 3, 4, 5]becomes:
> foobar = [0, 5, 3, 2]
[ 0, 5, 3, 2 ]
> foobar.map(x => x+1)
[ 1, 6, 4, 3 ]This is a bit trickier as my non-comprehension method in Python (for version 2.6 and older) doesn't translate well to JavaScript because of the lack of an Object constructor that accepts a list of pairs.
foobar = [{'key': 'fasdf', 'value': 'asfasdfaf'}, {'key': 'fassdfsddf', 'value': 'asdfaf'}]
>>> {x['key']: x['value'] for x in foobar}
{'fasdf': 'asfasdfaf', 'fassdfsddf': 'asdfaf'}
>>> # Intermediate translation to map
... dict(map(lambda x: (x['key'], x['value']), foobar))
{'fasdf': 'asfasdfaf', 'fassdfsddf': 'asdfaf'}can become (with the help of loash's _.fromPairs()):
> foobar = [{'key': 'fasdf', 'value': 'asfasdfaf'}, {'key': 'fassdfsddf', 'value': 'asdfaf'}]
[ { key: 'fasdf', value: 'asfasdfaf' },
{ key: 'fassdfsddf', value: 'asdfaf' } ]
> _.fromPairs(foobar.map(x => [x.key, x.value]))
{ fasdf: 'asfasdfaf', fassdfsddf: 'asdfaf' }but @mladlow recently clued me into an excellent use of Array.reduce to solve this problem:
> foobar = [{'key': 'fasdf', 'value': 'asfasdfaf'}, {'key': 'fassdfsddf', 'value': 'asdfaf'}]
[ { key: 'fasdf', value: 'asfasdfaf' },
{ key: 'fassdfsddf', value: 'asdfaf' } ]
> foobar.reduce((newObj, x) => Object.assign(newObj, {[x.key]: x.value}), {})
{ fasdf: 'asfasdfaf', fassdfsddf: 'asdfaf' }
> // or with spread
undefined
> foobar.reduce((newObj, x) => ({...newObj, [x.key]: x.value}), {})
{ fasdf: 'asfasdfaf', fassdfsddf: 'asdfaf' }>>> foobar = {'fasdf': 'asfasdfaf', 'fassdfsddf': 'asdfaf'}
>>> {key: val.upper() for key, val in foobar.items()}
{'fasdf': 'ASFASDFAF', 'fassdfsddf': 'ASDFAF'}foobar = {fasdf: 'asfasdfaf', fassdfsddf: 'asdfaf'}
Object.entries(foobar).reduce((acc, [key, value]) => ({...acc, [key]: value.toUpperCase()}), {})
{ fasdf: 'ASFASDFAF', fassdfsddf: 'ASDFAF' }