If you're looking for data points: I have never wanted exactly this, and
would find it a pretty bizarre thing to find in the standard library.
The most similar thing I've wanted would be to toggle something's
presence in a Set. Far more often than that, I've wanted something like
upsert or setdefault. Far more often than *that*, I've wanted
Map.prototype.get with a default value, though probably ?? covers that
scenario well enough now.
One reason why toggle's inclusion would seem weird to me is that it's
not clear to me whether it should remove all copies, or just the first
(so you'd need to toggle N times to clear out an array with N copies).
Nor is it obvious why an added-by-toggle element should be pushed onto
the end as opposed to somewhere else in the list (eg if I had a sorted
array, I'd probably expect it to be in the middle.) The main reason,
though, is that it feels rather niche.
On 2/8/20 4:45 AM, manuelbarzi wrote:
no intention in this proposal to discuss the `how`, but just the
`what`, as i assume everybody here knows how to implement it in a
polyfill, single function or any other approach. the proposal just
goes on the idea that "hey, we have already semantic things like
`some`, `every`, etc... in array, wouldn't it be useful to have the
`toggle` too? which in my case i found using and reusing in various
projects already. how about you, guys?" then if there is enough
quorum, just thinking about integrating it or not. that's all. thank you.
On Fri, Feb 7, 2020 at 10:36 PM Scott Rudiger <[email protected]
<mailto:[email protected]>> wrote:
I believe this wouldn't result in the OP's desired results since
the filtered array is no longer the same length as the original
array:
```js
var toggle = (arr, el) => Object.assign(arr, arr.filter(n => n !==
el));
toggle([1, 2, 3, 2, 1], 1); // [2, 3 ,2, 2, 1]
```
Here's a helper function that would work (and also push the
element if it's not included in the original array):
```js
var toggle = (arr, el) => {
var len = arr.length;
for (var i = 0; i < arr.length; i++)
if (arr[i] === el)
arr.splice(i--, 1);
if (arr.length === len)
arr.push(el);
return arr;
};
var a = toggle([1, 2, 3, 2, 1], 1); // mutates the original array
removing 1 => [2, 3, 2]
toggle(a, 1); // mutates the original array adding 1 => [2, 3, 2, 1]
```
On Fri, Feb 7, 2020 at 11:26 AM Herby Vojčík <[email protected]
<mailto:[email protected]>> wrote:
On 7. 2. 2020 13:11, Scott Rudiger wrote:
> `Array.prototype.filter` seems more versatile (although it
doesn't
> mutate the original array) since it removes elements based
on a function:
>
> ```js
> [1, 2, 3, 2, 1].filter(n => n !== 1); // [2, 3, 2]
> ```
But what if one wants to mutate in-place. Would this work?
Object.assign(arr, arr.filter(n => n !== 1))
If not, maybe there can be
aCollection.replaceWith(anIterable)
Herby
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss