Array.prototype.take
On May 25, 2012, at 2:42 , Irakli Gozalishvili wrote:
At the moment Array methods can do almost everything that one can do with plain
foriteration, only missing piece isbreak. Is there any chance to get something like:array.take(predicate)
You can use Array.prototype.some for that purpose:
function breakAtEmptyString(strArr) {
strArr.some(function (elem) {
if (elem.length === 0) {
return true; // break
}
console.log(elem);
// implicit: return undefined (interpreted as false)
});
}
Although,
takewould be way more useful if array methods chains were applied lazily. So that:array.filter(predicate).map(fn).take(once) would only call
fnup to a first match.
Agreed. The ability to chain iterators would be cool. IIRC, there are plans for a module of iterator tools.
Well some returns true or false I was talking more about taking slice of an array. You could obviously do things with an elements in some but it feels very wrong to push them into another array.
-- Irakli Gozalishvili Web: www.jeditoolkit.com
Sorry. Right. You want a combination of filter and map.
[1,2,3,4,3,2,1].takeWhile((x) => x < 4) => [1,2,3]
correct?
(I use 'takeWhile' here because it is what functional languages use 1; 'take' takes a fixed number of elements from a list.)
This is not the same as map+filter. (I'm not sure how map even would come into play; you're not transforming the data at all.)
Strawman implementation (without TypeErrors), if I understand correctly:
function takeWhile(pred, thisp) { var i; for (i = 0; i < this.length; ++i) { if (i in this) { var continue_ = pred.call(thisp, this[i], i, this); if (!continue_) { // Return all elements before this one. return this.slice(0, i); } } }
return this.slice(); // Clone.
}
If takeWhile is included, it makes sense to me that its complement, dropWhile, should also be included. (Simply replace .slice(0, i) with .slice(i), I think.)
And x.span(a, b) => [x.takeWhile(a, b), x.dropWhile(a, b)] to complete the set.
At the moment Array methods can do almost everything that one can do with plain
foriteration, only missing piece isbreak. Is there any chance to get something like:array.take(predicate)
Although,
takewould be way more useful if array methods chains were applied lazily. So that:array.filter(predicate).map(fn).take(once) would only call
fnup to a first match.Maybe
Array.prototype.takeis not a best fit, but would be great if we could get at least something to cover lack ofbreak.-- Irakli Gozalishvili Web: www.jeditoolkit.com