1
0
mirror of https://github.com/duke-git/lancet.git synced 2026-02-17 19:22:28 +08:00

fix: fix UniqueBy bug

This commit is contained in:
dudaodong
2024-08-08 10:40:23 +08:00
parent 356351896d
commit 3e7f94b03e
7 changed files with 27 additions and 18 deletions

View File

@@ -1416,7 +1416,7 @@ import "github.com/duke-git/lancet/v2/slice"
- **<big>Unique</big>** : remove duplicate elements in slice. - **<big>Unique</big>** : remove duplicate elements in slice.
[[doc](https://github.com/duke-git/lancet/blob/main/docs/en/api/packages/slice.md#Unique)] [[doc](https://github.com/duke-git/lancet/blob/main/docs/en/api/packages/slice.md#Unique)]
[[play](https://go.dev/play/p/AXw0R3ZTE6a)] [[play](https://go.dev/play/p/AXw0R3ZTE6a)]
- **<big>UniqueBy</big>** : call iteratee func with every item of slice, then remove duplicated. - **<big>UniqueBy</big>** : remove duplicate elements from the input slice based on the values returned by the iteratee function.
[[doc](https://github.com/duke-git/lancet/blob/main/docs/en/api/packages/slice.md#UniqueBy)] [[doc](https://github.com/duke-git/lancet/blob/main/docs/en/api/packages/slice.md#UniqueBy)]
[[play](https://go.dev/play/p/UR323iZLDpv)] [[play](https://go.dev/play/p/UR323iZLDpv)]
- **<big>UniqueByField</big>** : remove duplicate elements in struct slice by struct field. - **<big>UniqueByField</big>** : remove duplicate elements in struct slice by struct field.

View File

@@ -1417,7 +1417,7 @@ import "github.com/duke-git/lancet/v2/slice"
- **<big>Unique</big>** : 删除切片中的重复元素。 - **<big>Unique</big>** : 删除切片中的重复元素。
[[doc](https://github.com/duke-git/lancet/blob/main/docs/api/packages/slice.md#Unique)] [[doc](https://github.com/duke-git/lancet/blob/main/docs/api/packages/slice.md#Unique)]
[[play](https://go.dev/play/p/AXw0R3ZTE6a)] [[play](https://go.dev/play/p/AXw0R3ZTE6a)]
- **<big>UniqueBy</big>** : 对切片的每个元素调用 iteratee 函数,然后删除重复元素 - **<big>UniqueBy</big>** : 根据迭代函数返回的值,从输入切片中移除重复元素。此函数保持元素的顺序
[[doc](https://github.com/duke-git/lancet/blob/main/docs/api/packages/slice.md#UniqueBy)] [[doc](https://github.com/duke-git/lancet/blob/main/docs/api/packages/slice.md#UniqueBy)]
[[play](https://go.dev/play/p/UR323iZLDpv)] [[play](https://go.dev/play/p/UR323iZLDpv)]
- **<big>UniqueByField</big>** : 根据struct字段对struct切片去重复。 - **<big>UniqueByField</big>** : 根据struct字段对struct切片去重复。

View File

@@ -2284,12 +2284,12 @@ func main() {
### <span id="UniqueBy">UniqueBy</span> ### <span id="UniqueBy">UniqueBy</span>
<p>对切片的每个元素调用iteratee函数然后删除重复元素</p> <p>根据迭代函数返回的值,从输入切片中移除重复元素。此函数保持元素的顺序。</p>
<b>函数签名:</b> <b>函数签名:</b>
```go ```go
func UniqueBy[T comparable](slice []T, iteratee func(item T) T) []T func UniqueBy[T any, U comparable](slice []T, iteratee func(item T) U) []T
``` ```
<b>示例:<span style="float:right;display:inline-block;">[运行](https://go.dev/play/p/UR323iZLDpv)</span></b> <b>示例:<span style="float:right;display:inline-block;">[运行](https://go.dev/play/p/UR323iZLDpv)</span></b>
@@ -2309,7 +2309,7 @@ func main() {
fmt.Println(result) fmt.Println(result)
// Output: // Output:
// [1 2 0] // [1 2 3]
} }
``` ```

View File

@@ -2282,12 +2282,12 @@ func main() {
### <span id="UniqueBy">UniqueBy</span> ### <span id="UniqueBy">UniqueBy</span>
<p>Call iteratee func with every item of slice, then remove duplicated.</p> <p>Removes duplicate elements from the input slice based on the values returned by the iteratee function. this function maintains the order of the elements.</p>
<b>Signature:</b> <b>Signature:</b>
```go ```go
func UniqueBy[T comparable](slice []T, iteratee func(item T) T) []T func UniqueBy[T any, U comparable](slice []T, iteratee func(item T) U) []T
``` ```
<b>Example:<span style="float:right;display:inline-block;">[Run](https://go.dev/play/p/UR323iZLDpv)</span></b> <b>Example:<span style="float:right;display:inline-block;">[Run](https://go.dev/play/p/UR323iZLDpv)</span></b>
@@ -2307,7 +2307,7 @@ func main() {
fmt.Println(result) fmt.Println(result)
// Output: // Output:
// [1 2 0] // [1 2 3]
} }
``` ```

View File

@@ -783,17 +783,25 @@ func Unique[T comparable](slice []T) []T {
return result return result
} }
// UniqueBy call iteratee func with every item of slice, then remove duplicated. // UniqueBy removes duplicate elements from the input slice based on the values returned by the iteratee function.
// Play: https://go.dev/play/p/UR323iZLDpv // The function maintains the order of the elements.
func UniqueBy[T comparable](slice []T, iteratee func(item T) T) []T { // Play: todo
result := []T{} func UniqueBy[T any, U comparable](slice []T, iteratee func(item T) U) []T {
result := make([]T, 0, len(slice))
seen := make(map[U]struct{}, len(slice))
for _, v := range slice { for i := range slice {
val := iteratee(v) key := iteratee(slice[i])
result = append(result, val) if _, ok := seen[key]; ok {
continue
}
seen[key] = struct{}{}
result = append(result, slice[i])
} }
return Unique(result) return result
} }
// UniqueByField remove duplicate elements in struct slice by struct field. // UniqueByField remove duplicate elements in struct slice by struct field.

View File

@@ -777,7 +777,7 @@ func ExampleUniqueBy() {
fmt.Println(result) fmt.Println(result)
// Output: // Output:
// [1 2 0] // [1 2 3]
} }
func ExampleUniqueByField() { func ExampleUniqueByField() {

View File

@@ -733,7 +733,8 @@ func TestUniqueBy(t *testing.T) {
actual := UniqueBy([]int{1, 2, 3, 4, 5, 6}, func(val int) int { actual := UniqueBy([]int{1, 2, 3, 4, 5, 6}, func(val int) int {
return val % 4 return val % 4
}) })
assert.Equal([]int{1, 2, 3, 0}, actual)
assert.Equal([]int{1, 2, 3, 4}, actual)
} }
func TestUniqueByField(t *testing.T) { func TestUniqueByField(t *testing.T) {