> The example code isn't very compelling either; something more real-world 
> would be good

I recently ran across a usage of `reduce(..)` that could have benefitted from 
an early return. Figured I'd just drop it here for posterity sake, in case 
anything ever comes of this idea.

I had an array of arrays (2-dimensional array), where each inner array had a 
list of simple string/number elements (none of them falsy) that could have some 
repetition within the inner array. I wanted to filter the outer array (the list 
of the inner arrays) based on whether an inner array had any adjacent 
duplicates. That is, `[1,4,2,4]` is fine to keep but `[2,4,4,5]` should be 
filtered out.

Since `reduce(..)` conveniently can compare two adjacent elements if you always 
return the current value, I decided to model the inner check as a `reduce(..)` 
that reduces from the original array value to either a `false` or a truthy 
value (the last element of the inner array element). This reduction result then 
is how `filter(..)` decides to keep or discard. The reason an early exit would 
be nice is that as soon as you run across an adjacency-duplication, no more 
reduction is necessary -- you can immediately "reduce" to `false`.

Here's how I did it, which worked but which was slightly less appealing:

```js
var outer = [
  // [1,2,1,3,4,2]
  // ["foo","bar","bar",10,"foo"]
  // ..
];

outer = outer.filter(function filterer(inner){
  return inner.reduce(function reducer(prev,current){
    if (prev === false || prev === current) return false;
    return current;
  });
});
```

The reduction initial-value is omitted, so it's `undefined`, which never 
matches any of the `inner` contents.

The `prev === false` check is the way that I fake the "early exit", by which 
once the reduction value is tripped to `false`, that's always the result for 
the rest of the reduction.

There's lots of other ways to "slice" that problem, I know. But reduction was 
attractive except for its lack of early exit.
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to