It's a little confusing to simultaneously use reduce and push. Use reduce when you're actually computing a new value, use a for of loop when you're mutating things in a loop.
// Use this
const flattened = as => as.reduce((p, c) => [...p, ...c], [])
// Or this
const flattened = []
for (const item of as) {
flattened.push(...item)
}
Your first example chokes on [1,[2,3,[4]],5,[6,7]], throwing an error. Worse, on ['yo',['dawg','I',['herd']],'you',['like','arrays']] it breaks in a number of interesting ways, spreading some strings, failing to spread some arrays.
Sorry to hear you feel that way. I was just suggesting that using mutation in reduce is confusing, didn't mean for it to turn into this long-running back and forth.
Great article! Whenever I feel like I need to add Lodash to a new project I try to solve my immediate needs with plain Javascript first. Turns out most of the times that's enough.
It's an awesome library, but I like to keep my projects as simple as possible.
My only issue with it is that it doesn't recursively merge. It's fine for flat objects. I use this pattern pretty often at work, sometimes in conjunction with lodash.
For instance, I use Objection for ORM and it has "computed properties" that need to be accessed in order to get the value, they're not serialized when doing toJSON so I often resort to:
Extremely quick and dirty homebrew of a flatten function:
EDITED: Return a fresh array instead of modifying flatArray. Clearer, less prone to nitpickery.
It's a little confusing to simultaneously use
reduceandpush. Usereducewhen you're actually computing a new value, use afor ofloop when you're mutating things in a loop.Your first example chokes on
[1,[2,3,[4]],5,[6,7]], throwing an error. Worse, on['yo',['dawg','I',['herd']],'you',['like','arrays']]it breaks in a number of interesting ways, spreading some strings, failing to spread some arrays.It is an implementation of the join function for arrays, and works with arrays of arrays, not arrays of mixed objects.
If you need it to work with mixed objects you'll need a recursive call (or
ap+pure):Anyway, the point is to avoid mutation in the
reduce, whatever it is you may be implementing.At this point it honestly seems like you're just trying to score points against me, in some way. I am disinterested in continuing that.
Sorry to hear you feel that way. I was just suggesting that using mutation in
reduceis confusing, didn't mean for it to turn into this long-running back and forth.Quick way to flatten 1 deep
const feed = [].concat(...sourceArray)i do the same ;)
wow. That's awesome! It took me a few to figure out how this works.
Great article! Whenever I feel like I need to add Lodash to a new project I try to solve my immediate needs with plain Javascript first. Turns out most of the times that's enough.
It's an awesome library, but I like to keep my projects as simple as possible.
You can also use mutlple sources in the RHS of a spead expression to get a merge
do you mean like this?
My only issue with it is that it doesn't recursively merge. It's fine for flat objects. I use this pattern pretty often at work, sometimes in conjunction with lodash.
For instance, I use Objection for ORM and it has "computed properties" that need to be accessed in order to get the value, they're not serialized when doing
toJSONso I often resort to:EDIT Totally forgot, this is a pretty common pattern in Redux!
Completely agree. Its shallow like Object.assign. I was just say is an alternative to it really.
measurethat.net/Benchmarks/Show/29...