Slice Util

Implementing array manipulation functions in JavaScript in Golang

Usage

English | 简体中文

Import

import "github.com/wyb199877/sliceutil"

Operation Functions

Foreach

Iterate over the elements in the slice

func Foreach[T any](
  slice []T, 
  action func(item T, index int, slice []T)
)

sl := []int{1, 2, 3}
sliceutil.Foreach(sl, func(it int, idx int, s []int) {
  // ... do something
})

Map

Conversion of elements in slices

func Map[T, R any](
  slice []T,
  action func(item T, index int, slice []T) R,
) []R

sl := []int{1, 2, 3}
strs := sliceutil.Map(sl, func(it int, idx int, s []int) string {
  return strconv.Itoa(it)
})
// strs = ["1" "2" "3"]

Filter

Slice element filter

func Filter[T any](
  slice []T,
  action func(value T, index int, slice []T) bool,
) []T 

sl := []int{1, 2, 3}
odds := sliceutil.Filter(sl, func(it int, idx int, s []int) bool {
  return it%2 != 0
})
// odds = [1 3]

Reduce

Slice element accumulator (no initial value implemented)

func Reduce[T any](
  slice []T,
  action func(result T, item T, index int, slice []T) T,
) T

sl := []int{1, 2, 3}
sum := sliceutil.Reduce(sl, func(ret int, it int, idx int, s []int) int {
  return ret + it
})
// sum = 6

Search Functions

Find

Find the first element that satisfies the condition in the slice

func Find[T any](
  slice []T,
  action func(item T, index int, slice []T) bool,
) (t T, hasFound bool)

sl := []int{1, 2, 3}
target, hasFound := sliceutil.Find(sl, func(it int, idx int, s []int) bool {
  return it%2 != 0
})
// target = 1, hasFound = true

target, hasFound = sliceutil.Find(sl, func(it int, idx int, s []int) bool {
  return it > 3
})
// target = 0, hasFound = false

FindIndex

Find the index of the first element that meets the condition in the slice

func FindIndex[T any](
  slice []T,
  action func(item T, index int, slice []T) bool,
) int

sl := []int{1, 2, 3}
index := sliceutil.FindIndex(sl, func(it int, idx int, s []int) bool {
  return it%2 != 0
})
// index = 0

index = sliceutil.FindIndex(sl, func(it int, idx int, s []int) bool {
  return it > 3
})
// index = -1

IndexOf

Finds the index of the first element that equal to the target value in the slice

func IndexOf[T comparable](slice []T, target T) int

sl := []int{1, 2, 3}
index := sliceutil.IndexOf(sl, 1)
// index = 0

index = sliceutil.IndexOf(sl, 4)
// index = -1

LastIndexOf

Finds the index of the last element that equal to the target value in the slice

func LastIndexOf[T comparable](slice []T, target T) int

sl := []int{1, 2, 3, 1}
index := sliceutil.LastIndexOf(sl, 1)
// index = 3

index = sliceutil.LastIndexOf(sl, 4)
// index = -1

Includes

Determine whether there is an element equal to the target value in the slice

func Includes[T comparable](slice []T, target T) bool

sl := []int{1, 2, 3}
isExist := sliceutil.Includes(sl, 1)
// isExist = true

isExist = sliceutil.Includes(sl, 4)
// isExist = false

Some

Determine if there is an element in the slice that satisfies the condition

func Some[T any](
  slice []T,
  action func(item T, index int, slice []T) bool,
) bool

sl := []int{1, 3, 5}
isExist := sliceutil.Some(sl, func(it int, idx int, s []int) bool {
  return it%2 != 0
})
// isExist = true

isExist = sliceutil.Some(sl, func(it int, idx int, s []int) bool {
  return it%2 == 0
})
// isExist = false

Every

Determines whether all elements in the slice satisfy the condition

func Every[T any](
  slice []T,
  action func(item T, index int, slice []T) bool,
) bool

sl := []int{1, 3, 5}
isEvery := sliceutil.Every(sl, func(it int, idx int, s []int) bool {
  return it%2 != 0
})
// isEvery = true

isEvery = sliceutil.Every(sl, func(it int, idx int, s []int) bool {
  return it%2 == 0
})
// isEvery = false

Modification Functions

Functions under this heading operate directly on the memory space to which the slice address points

Insert

Insert elements at the position of index in the slice

func Insert[T any](sp *[]T, index int, items ...T)

sl := []int{1, 3, 4}
sliceutil.Insert(&sl, 1, 2)
// sl = [1 2 3 4]

Remove

Removes an element from a slice at the position of index (make sure there is an element at that position)

func Remove[T any](sp *[]T, index int)

sl := []int{1, 3, 4}
sliceutil.Remove(&sl, 1)
// sl = [1 4]

Push

Insert elements at the end of slice

func Push[T any](sp *[]T, items ...T)

sl := []int{1, 2, 3}
sliceutil.Push(&sl, 4)
// sl = [1 2 3 4]

Pop

Pops up and returns the last element of a slice (do not operate on empty slices)

func Pop[T any](sp *[]T) T

sl := []int{1, 2, 3}
last := sliceutil.Pop(&sl)
// last = 3, sl = [1 2]

Unshift

Insert elements at the start of slice

func Unshift[T any](sp *[]T, items ...T)

sl := []int{2, 3, 4}
sliceutil.Unshift(&sl, 1)
// sl = [1 2 3 4]

Shift

Pops up and returns the first element of a slice (do not operate on empty slices)

func Shift[T any](sp *[]T) T

sl := []int{1, 2, 3}
first := sliceutil.Shift(&sl)
// first = 1, sl = [2 3]

Reversal functions

Reverse

Reverse the order of the elements in the slice (only copy, no memory space operation)

func Reverse[T any](slice []T) []T

sl := []int{1, 2, 3}
sl = sliceutil.Reverse(sl)
// sl = [3 2 1]

ReverseSelf

Reverse the order of the elements in the slice (operate the memory space)

func ReverseSelf[T any](slice []T)

sl := []int{1, 2, 3}
sliceutil.ReverseSelf(sl)
// sl = [3 2 1]

Conversion functions

ToMap

Convert slice to map

func ToMap[T any, K comparable, V any](
  slice []T,
  key func(item T) K,
  value func(item T) V,
) map[K]V 

sl := []string{"a", "b", "c"}
mp := sliceutil.ToMap(sl, func(it string) string {
  return strings.ToUpper(it)
}, func(it string) string {
  return it
})
// mp = map[string]string{"A":"a", "B":"b", "C":"c"}

Copy Functions

Copy

Copy slice

func Copy[T any](slice []T) []T

sl := []int{1, 2, 3, 4}
copied := sliceutil.Copy(sl)
copied[0] = 99
// sl = [1 2 3 4] copied = [99 2 3 4]

Cut

Cut, return a copy

func Cut[T any](slice []T, start int, end int) []T

sl := []int{1, 2, 3, 4}
cut := sliceutil.Cut(sl, 1, 3)
cut[0] = 99
// sl = [1, 2, 3, 4] cut = [99, 3]

CutFromFirst

Cut from first element, return a copy

func CutFromFirst[T any](slice []T, end int) []T

sl := []int{1, 2, 3, 4}
cut := sliceutil.CutFromFirst(sl, 3)
cut[0] = 99
// sl = [1 2 3 4] cut = [99 2 3]

CutToLast

Cut to last element, return a copy

func CutToLast[T any](slice []T, start int) []T

sl := []int{1, 2, 3, 4}
cut := sliceutil.CutToLast(sl, 1)
cut[0] = 99
// sl = [1 2 3 4] cut = [99 3 4]

GitHub

View Github