Skip to content

Commit

Permalink
feat(useArrayJoin): new function (#1904)
Browse files Browse the repository at this point in the history
  • Loading branch information
huynl-96 committed Jul 16, 2022
1 parent 79e4433 commit dea1d76
Show file tree
Hide file tree
Showing 4 changed files with 102 additions and 0 deletions.
1 change: 1 addition & 0 deletions packages/shared/index.ts
Expand Up @@ -33,6 +33,7 @@ export * from './tryOnUnmounted'
export * from './until'
export * from './useArrayEvery'
export * from './useArrayFilter'
export * from './useArrayJoin'
export * from './useArrayMap'
export * from './useArraySome'
export * from './useCounter'
Expand Down
50 changes: 50 additions & 0 deletions packages/shared/useArrayJoin/index.md
@@ -0,0 +1,50 @@
---
category: Utilities
---

# useArrayJoin

Reactive `Array.join`

## Usage

### Use with array of multiple refs

```js
import { useArrayJoin } from '@vueuse/core'
const item1 = ref('foo')
const item2 = ref(0)
const item3 = ref({ prop: 'val' })
const list = [item1, item2, item3]
const result = useArrayJoin(list)
// result.value: foo,0,[object Object]
item1.value = 'bar'
// result.value: bar,0,[object Object]
```

### Use with reactive array

```js
import { useArrayJoin } from '@vueuse/core'
const list = ref(['string', 0, { prop: 'val' }, false, [1], [[2]], null, undefined, []])
const result = useArrayJoin(list)
// result.value: string,0,[object Object],false,1,2,,,
list.value.push(true)
// result.value: string,0,[object Object],false,1,2,,,,true
list.value = [null, 'string', undefined]
// result.value: ,string,
```

### Use with reactive separator

```js
import { useArrayJoin } from '@vueuse/core'
const list = ref(['string', 0, { prop: 'val' }])
const separator = ref()
const result = useArrayJoin(list, separator)
// result.value: string,0,[object Object]
separator.value = ''
// result.value: string0[object Object]
separator.value = '--'
// result.value: string--0--[object Object]
```
40 changes: 40 additions & 0 deletions packages/shared/useArrayJoin/index.test.ts
@@ -0,0 +1,40 @@
import { ref } from 'vue-demi'
import { useArrayJoin } from '../useArrayJoin'

describe('useArrayJoin', () => {
it('should be defined', () => {
expect(useArrayJoin).toBeDefined()
})

it('should work with array of refs', () => {
const item1 = ref('foo')
const item2 = ref(0)
const item3 = ref({ prop: 'val' })
const list = [item1, item2, item3]
const result = useArrayJoin(list)
expect(result.value).toBe('foo,0,[object Object]')
item1.value = 'bar'
expect(result.value).toBe('bar,0,[object Object]')
})

it('should work with reactive array', () => {
const list = ref(['string', 0, { prop: 'val' }, false, [1], [[2]], null, undefined, []])
const result = useArrayJoin(list)
expect(result.value).toBe('string,0,[object Object],false,1,2,,,')
list.value.push(true)
expect(result.value).toBe('string,0,[object Object],false,1,2,,,,true')
list.value = [null, 'string', undefined, 0, [], [1], [[2]], { prop: 'val' }]
expect(result.value).toBe(',string,,0,,1,2,[object Object]')
})

it('should work with reactive separator', () => {
const list = ref(['string', 0, { prop: 'val' }, [1], [[2]], null, undefined, []])
const separator = ref()
const result = useArrayJoin(list, separator)
expect(result.value).toBe('string,0,[object Object],1,2,,,')
separator.value = ''
expect(result.value).toBe('string0[object Object]12')
separator.value = '-'
expect(result.value).toBe('string-0-[object Object]-1-2---')
})
})
11 changes: 11 additions & 0 deletions packages/shared/useArrayJoin/index.ts
@@ -0,0 +1,11 @@
import type { MaybeComputedRef } from '@vueuse/shared'
import { resolveUnref } from '@vueuse/shared'
import type { ComputedRef } from 'vue-demi'
import { computed } from 'vue-demi'

export function useArrayJoin(
list: MaybeComputedRef<MaybeComputedRef<any>[]>,
separator?: MaybeComputedRef<string>,
): ComputedRef<string> {
return computed(() => resolveUnref(list).map(i => resolveUnref(i)).join(resolveUnref(separator)))
}

0 comments on commit dea1d76

Please sign in to comment.