fullstacksjs / toolbox

A zero-dependency 📦 tree-shakable🌲 collection of missing JavaScript utilities.
https://toolbox.fullstacksjs.com/
MIT License
56 stars 15 forks source link

[Proposal]: toggleArrayValue #49

Closed mahdi-sheibak closed 1 year ago

mahdi-sheibak commented 1 year ago

Scope

array

Function Signature

function toggleArrayValue<T extends unknown>(array: T[], value: T): T[]

Motivation

This function, called toggleArrayValue, is useful for toggling the presence of a specific value within an array. It allows you to easily add the value to the array if it is not already present, or remove it if it is already present.

This can be particularly motivating in scenarios where you need to manage a list of selected items or toggling options on and off. By using this function, you can easily update the array without having to write conditional checks or multiple statements.

ASafaeirad commented 1 year ago

An array is not a proper data structure for this behavior. Maybe Set or Map are better options.

mahdi-sheibak commented 1 year ago
function toggleMapValue<T extends unknown>(map: T[], value: T): T[]

?? Kindly provide additional information to enhance the understanding of the subject matter.

ASafaeirad commented 1 year ago

The array data structure is meant to store ordered data. Toggling a value in an array does not make sense in most cases. Let's say we have a variety like [1, 2, 1, 2, 1] What does it mean to toggle 1 here?

In case the order does not matter and each item can be present or not it's better to use a Map or dictionary like:

new Map([
 [1, true],
 [2, true]
])

or

{
  1: true,
  2: true,
}

Then toggling 1 here means removing it or setting 1 to false.

If order matters we can use a Set, like

new Set([1, 2, 1, 2, 1]) // Set({1,2})

Here toggling 1 means removing 1 from the set.

mahdi-sheibak commented 1 year ago

the order of elements doesn't matter, and the presence of a value in the list signifies 'true,' I've come to the realization that this can be efficiently managed using JavaScript's Set, which allows for easy addition, deletion, and checking for existence. As a result, I am closing this issue.