Nice work. Just a little note on the last couple of examples. If you want to do this in a functional style, it's important not to mutate state in the map function.
In your last example, the first map actually mutates the original collection with the ++ operator. In order to keep the original collection unchanged you can use the object spread operator in upcoming versions of Javascript, but for now you'll need to do something like this:
The second call to map also has the same issue in that it has a side-effect (I/O in this case) that causes the entire expression to return an array of undefined. Obviously there is no way to do I/O without a side-effect and thus the higher-order function you should use here is forEach (which perhaps is the topic of an upcoming blog post?)!
Age should be parsed as integer, in order to get the addition working, otherwise it will be treated as a string and will result i.e, for age 10, in age: 101
Sure, although I'd argue that a better approach would be to represent the age as an integer in the data structure. Especially if the program is planning to perform arithmatic on it! :)
For further actions, you may consider blocking this person and/or reporting abuse
We're a place where coders share, stay up-to-date and grow their careers.
Nice work. Just a little note on the last couple of examples. If you want to do this in a functional style, it's important not to mutate state in the
map
function.In your last example, the first
map
actually mutates the original collection with the++
operator. In order to keep the original collection unchanged you can use the object spread operator in upcoming versions of Javascript, but for now you'll need to do something like this:The second call to
map
also has the same issue in that it has a side-effect (I/O in this case) that causes the entire expression to return an array ofundefined
. Obviously there is no way to do I/O without a side-effect and thus the higher-order function you should use here isforEach
(which perhaps is the topic of an upcoming blog post?)!Finally:
This is a really excellent point Andrew, and something I totally missed while I was writing it. Thank you for the information and examples!
For the record, it's also possible by spreading the object, although it won't work everywhere at the moment, depending on your ES version:
Clean it even more by extracting callbacks
It's beautiful :O
Quick Fix to get this example working:
students
.map(s => Object.assign({}, s, {age: parseInt(s.age, 10) + 1}))
.filter(s => s.age < 12)
.forEach(s => console.log(s));
Age should be parsed as integer, in order to get the addition working, otherwise it will be treated as a string and will result i.e, for age 10, in age: 101
Sure, although I'd argue that a better approach would be to represent the age as an integer in the data structure. Especially if the program is planning to perform arithmatic on it! :)