Thanks Oliver for the quick response.

The problem for me with forEach, that it's pretty much like a for loop.
Anything can go inside the iteration logic.
However with filter/map/reduce/some/every functions, the intention is
explicit.
Also you don't need to implement basic array operations that the above
mentioned functions already provide.

For instance in my opinion writing something like:
a.filter()
  .map()
  .reduce()

Is much clearer and safer than:

let reducedValue
a.forEach(item => {
  if(!<filter condition>) return
  const mappedItem = mappingLogic(item)
  reducedValue = reduceLogic(mappedItem)
})



On Fri, Jun 21, 2019 at 11:58 PM Oliver Dunk <oli...@oliverdunk.com> wrote:

> This seems like a good place to share the idea, and it’s helpful that you
> provided use cases etc.
>
> Is there a reason why you prefer the proposed syntax over the forEach loop
> you mentioned? Personally I like how the forEach is easy to understand, but
> maybe there are other examples of when the stream is useful and the
> polyfill is much more complex.
>
> > On 21 Jun 2019, at 16:32, Roma Bronstein <outsiden...@gmail.com> wrote:
> >
> > Hi,
> >
> > It's my first time suggesting a feature, hope I'm doing it correctly.
> >
> > I really like using Array.prototype.map(), Array.prototype.reduce() and
> all related functions.
> > The code is more readable and it looks better.
> > However, when I want to write performance sensitive code, chaining these
> functions is not a good approach.
> > For example, writing this:
> > // a is an Array of length N
> > const b = a.filter().map()
> >
> > will require 2 traversals over the whole array, up to 2*N iterations (if
> the filter passes all items).
> >
> > This is why I often resort to writing this:
> > const b= []
> > a.forEach(() => {
> >   if (/*the filter condition*/)
> >     b.push(/*mapping logic*/)
> > })
> >
> > Which requires only N iterations.
> >
> > I suggest adding a capability to streamline items to these functions.
> > I get my inspiration from Redis's transaction syntax where you declare
> starting a transaction and finally call EXEC in order to execute it.
> > So now I'll be able to write something like this:
> > const b = a.stream()
> >   .filter()
> >   .map()
> >   .exec()
> >
> > Just to clarify the example:
> > I've declared that I'd like to stream array items of a. Then I've
> chained the functions I'd like to items to pass through.
> > Finally I've activated it using the exec() function.
> >
> > I'm not sure if this is the best syntactical approach, but this example
> is more intuitive to understand in my opinion.
> >
> > Another approach could be thinking about a "pipeline" operator like in
> UNIX cli, providing a more generic capability to pipeline iterators.
> >
> > Again, I hope I'm doing this correctly and in the right forum.
> > And if so, I'd be happy to hear some feedback.
> >
> > Thanks,
> > Roma
> >
> >
> >
> > _______________________________________________
> > 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