9
9
\_/__/
10
10
```
11
11
12
- # Underscore.go [ ![ GoDoc] ( https://godoc.org/github.com/ahl5esoft/golang-underscore?status.svg )] ( https://godoc.org/github.com/ahl5esoft/golang-underscore ) [ ![ Go Report Card] ( https://goreportcard.com/badge/github.com/ahl5esoft/golang-underscore )] ( https://goreportcard.com/report/github.com/ahl5esoft/golang-underscore ) ![ Version] ( https://img.shields.io/badge/version-1.0 .0-green.svg )
12
+ # Underscore.go [ ![ GoDoc] ( https://godoc.org/github.com/ahl5esoft/golang-underscore?status.svg )] ( https://godoc.org/github.com/ahl5esoft/golang-underscore ) [ ![ Go Report Card] ( https://goreportcard.com/badge/github.com/ahl5esoft/golang-underscore )] ( https://goreportcard.com/report/github.com/ahl5esoft/golang-underscore ) ![ Version] ( https://img.shields.io/badge/version-1.1 .0-green.svg )
13
13
like <a href =" http://underscorejs.org/ " >underscore.js</a >, but for Go
14
14
15
15
## Installation
@@ -19,13 +19,7 @@ like <a href="http://underscorejs.org/">underscore.js</a>, but for Go
19
19
$ go get -u github.com/ahl5esoft/golang-underscore
20
20
21
21
## Lack
22
- * Performance optimization
23
- * Benchmark
24
- * Compatible with ` .NET LINQ `
25
- * more...
26
-
27
- ## Suggest
28
- always using `chain`
22
+ * IQuery性能差,将来会逐步用IEnumerable替代
29
23
30
24
## Documentation
31
25
@@ -57,17 +51,15 @@ like <a href="http://underscorejs.org/">underscore.js</a>, but for Go
57
51
* [ ` Sort ` ] ( #sort ) , [ ` SortBy ` ] ( #sortBy )
58
52
* [ ` Take ` ] ( #take )
59
53
* [ ` Uniq ` ] ( #uniq ) , [ ` UniqBy ` ] ( #uniqBy )
60
- * [ ` Value ` ] ( #value )
61
54
* [ ` Values ` ] ( #values )
62
55
* [ ` Where ` ] ( #where ) , [ ` WhereBy ` ] ( #whereBy )
63
56
64
57
<a name =" all " />
65
58
66
- ### All(source, predicate)
59
+ ### All(predicate) bool
67
60
68
61
__ Arguments__
69
62
70
- * ` source ` - array or map
71
63
* ` predicate ` - func(element, index or key) bool
72
64
73
65
__ Return__
@@ -77,59 +69,47 @@ __Return__
77
69
__ Examples__
78
70
79
71
``` go
80
- src := []testModel{
72
+ ok := Chain2 ( []testModel{
81
73
{ID: 1 , Name: " one" },
82
74
{ID: 1 , Name: " two" },
83
75
{ID: 1 , Name: " three" },
84
- }
85
- ok := All (src, func (r testModel, _ int ) bool {
86
- return r.Id == 1
76
+ }).All (func (r testModel, _ int ) bool {
77
+ return r.ID == 1
87
78
})
88
79
// ok == true
89
80
```
90
81
91
82
<a name =" allBy " />
92
83
93
- ### AllBy(source, properties)
84
+ ### AllBy(properties) bool
94
85
95
86
__ Arguments__
96
87
97
- * ` source ` - array or map
98
88
* ` properties ` - map[ string] interface{}
99
89
100
90
__ Return__
101
91
102
- * bool
92
+ * bool - all the values that pass a truth test ` predicate `
103
93
104
94
__ Examples__
105
95
106
96
``` go
107
- src := []testModel{
97
+ ok := Chain2 ( []testModel{
108
98
{ID: 1 , Name: " one" },
109
- {ID: 1 , Name: " two" },
110
- {ID: 1 , Name: " three" },
111
- }
112
- ok := AllBy (src, nil )
113
- // ok == true
114
-
115
- ok = AllBy (src, map [string ]interface {}{
116
- " name" : " a" ,
117
- })
118
- // ok == false
119
-
120
- ok = AllBy (src, map [string ]interface {}{
121
- " id" : 1 ,
99
+ {ID: 2 , Name: " one" },
100
+ {ID: 3 , Name: " one" },
101
+ }).AllBy (map [string ]interface {}{
102
+ " name" : " one" ,
122
103
})
123
104
// ok == true
124
105
```
125
106
126
107
<a name =" any " />
127
108
128
- ### Any(source, predicate)
109
+ ### Any(predicate) bool
129
110
130
111
__ Arguments__
131
112
132
- * ` source ` - array or map
133
113
* ` predicate ` - func(element or value, index or key) bool
134
114
135
115
__ Return__
@@ -139,24 +119,22 @@ __Return__
139
119
__ Examples__
140
120
141
121
``` go
142
- src := []testModel{
122
+ ok := Chain2 ( []testModel{
143
123
{ID: 1 , Name: " one" },
144
124
{ID: 2 , Name: " two" },
145
125
{ID: 3 , Name: " three" },
146
- }
147
- ok := Any (src, func (r testModel, _ int ) bool {
148
- return r.Id == 0
126
+ }).Any (func (r testModel, _ int ) bool {
127
+ return r.ID == 0
149
128
})
150
129
// ok == false
151
130
```
152
131
153
132
<a name =" anyBy " />
154
133
155
- ### AnyBy(source, properties)
134
+ ### AnyBy(properties) bool
156
135
157
136
__ Arguments__
158
137
159
- * ` source ` - array or map
160
138
* ` properties ` - map[ string] interface{}
161
139
162
140
__ Return__
@@ -166,19 +144,12 @@ __Return__
166
144
__ Examples__
167
145
168
146
``` go
169
- src := []testModel{
147
+ ok := Chain2 ( []testModel{
170
148
{ID: 1 , Name: " one" },
171
149
{ID: 2 , Name: " two" },
172
150
{ID: 3 , Name: " three" },
173
- }
174
- ok := AnyBy (src, map [string ]interface {}{
175
- " Id" : 0 ,
176
- })
177
- // ok == false
178
-
179
- ok = AnyBy (src, map [string ]interface {}{
180
- " id" : src[0 ].Id ,
181
- " name" : src[0 ].Name ,
151
+ }).AnyBy (map [string ]interface {}{
152
+ " name" : " two" ,
182
153
})
183
154
// ok == true
184
155
```
@@ -272,66 +243,56 @@ Each(src, func (r testModel, i int) {
272
243
273
244
<a name =" find " />
274
245
275
- ### Find(source, predicate)
246
+ ### Find(predicate) IQuery
247
+ ### Find(predicate) IEnumerable
276
248
277
249
__ Arguments__
278
250
279
- * ` source ` - array or map
280
251
* ` predicate ` - func(element or value, index or key) bool
281
252
282
- __ Return__
283
-
284
- * interface{} -- ` source ` elem
285
-
286
253
__ Examples__
287
254
288
255
``` go
289
- src := []testModel{
290
- {ID: 1 , Name: " one" },
291
- {ID: 2 , Name: " two" },
292
- {ID: 3 , Name: " three" },
293
- }
294
- var item testModel
295
- Chain (src).Find (func (r testModel, _ int ) bool {
296
- return r.ID == 1
297
- }).Value (&item)
256
+ var dst int
257
+ Chain2 ([]int {1 , 2 , 3 }).Find (func (r, _ int ) bool {
258
+ return r == 2
259
+ }).Value (&dst)
260
+ // dst == 2
298
261
// or
299
- item := Find (src, func (r testModel, _ int ) bool {
300
- return r.ID == 1
301
- })
302
- // item == arr[0]
262
+ var dst int
263
+ Chain2 ([][]int {
264
+ []int {1 , 3 , 5 , 7 },
265
+ []int {2 , 4 , 6 , 8 },
266
+ }).Find (func (r []int , _ int ) bool {
267
+ return r[0 ]%2 == 0
268
+ }).Find (func (r, _ int ) bool {
269
+ return r > 6
270
+ }).Value (&dst)
271
+ // dst == 8
303
272
```
304
273
305
274
<a name =" findBy " />
306
275
307
- ### FindBy(source, properties)
276
+ ### FindBy(properties) IQuery
277
+ ### FindBy(properties) IEnumerable
308
278
309
279
__ Arguments__
310
280
311
- * ` source ` - array or map
312
281
* ` properties ` - map[ string] interface{}
313
282
314
- __ Return__
315
-
316
- * interface{} - ` source ` elem
317
-
318
283
__ Examples__
319
284
320
285
``` go
321
- arr := []testModel{
286
+ src := []testModel{
322
287
{ID: 1 , Name: " one" },
323
288
{ID: 2 , Name: " two" },
324
289
{ID: 3 , Name: " three" },
325
290
}
326
- var item testModel
327
- Chain (arr).FindBy (map [string ]interface {}{
328
- " id" : 2 ,
329
- }).Value (&item)
330
- // or
331
- item := FindBy (arr, map [string ]interface {}{
291
+ var dst testModel
292
+ Chain2 (src).FindBy (map [string ]interface {}{
332
293
" id" : 2 ,
333
- })
334
- // item == arr [1]
294
+ }). Value (&dst)
295
+ // dst == src [1]
335
296
```
336
297
337
298
<a name =" findIndex " />
@@ -390,28 +351,26 @@ i := FindIndexBy(arr, map[string]interface{}{
390
351
391
352
<a name =" first " />
392
353
393
- ### First(source)
354
+ ### First() IQuery
355
+ ### First() IEnumerable
394
356
395
357
__ Arguments__
396
358
397
- * ` source ` - array or map
398
-
399
- __ Return__
400
-
401
- * interface{}
359
+ * ` predicate ` - func(element or value, index or key) bool
402
360
403
361
__ Examples__
404
362
405
363
``` go
406
- arr := [] int { 1 , 2 , 3 }
407
- var res int
408
- Chain (arr). First (). Value (&res)
364
+ var dst int
365
+ Chain2 ([] int { 1 , 2 , 3 }). First (). Value (&dst)
366
+ // dst == 1
409
367
// or
410
- res := First (arr).(int )
411
- // res = 1
412
-
413
- res := First (nil )
414
- // res == nil
368
+ var dst int
369
+ Chain2 ([][]int {
370
+ []int {1 , 3 , 5 , 7 },
371
+ []int {2 , 4 , 6 , 8 },
372
+ }).First ().First ().Value (&dst)
373
+ // dst == 1
415
374
```
416
375
417
376
<a name =" group " />
@@ -872,39 +831,36 @@ nameRV, err := getNameRV(item)
872
831
873
832
<a name =" range " />
874
833
875
- ### Range(start, stop, step)
834
+ ### Range(start, stop, step) IQuery
835
+ ### Range(start, stop, step) IEnumerable
876
836
877
837
__ Arguments__
878
838
879
839
* ` start ` - int
880
840
* ` stop ` - int
881
841
* ` step ` - int
882
842
883
- __ Return__
884
-
885
- * IQuery - a wrapped object, wrapped objects until value is called
886
-
887
843
__ Examples__
888
844
889
845
``` go
890
846
var res []int
891
- Range (0 , 0 , 1 ).Value (&res)
847
+ Range2 (0 , 0 , 1 ).Value (&res)
892
848
// res = []
893
849
894
850
var res []int
895
- Range (0 , 10 , 0 ).Value (&res)
896
- // res = []
851
+ Range2 (0 , 10 , 0 ).Value (&res)
852
+ // panic
897
853
898
854
var res []int
899
- Range ( 10 , 0 , 1 ).Value (&res)
900
- // res = []
855
+ Range2 ( 4 , 0 , - 1 ).Value (&res)
856
+ // res = [4 3 2 1 ]
901
857
902
858
var res []int
903
- Range (0 , 2 , 1 ).Value (&res)
859
+ Range2 (0 , 2 , 1 ).Value (&res)
904
860
// res = [0 1]
905
861
906
862
var res []int
907
- Range (0 , 3 , 2 ).Value (&res)
863
+ Range2 (0 , 3 , 2 ).Value (&res)
908
864
// res = [0 2]
909
865
```
910
866
@@ -1224,25 +1180,6 @@ res := UniqBy(arr, "Name").([]testModel)
1224
1180
// res = [{{0} 1 one}]
1225
1181
```
1226
1182
1227
- <a name =" value " />
1228
-
1229
- ### Value(result)
1230
-
1231
- __ Examples__
1232
-
1233
- ``` go
1234
- arr := []int {1 , 2 , 1 , 4 , 1 , 3 }
1235
- var res map [string ][]int
1236
- Chain (arr).Uniq (nil ).Group (func (n, _ int ) string {
1237
- if n%2 == 0 {
1238
- return " even"
1239
- }
1240
-
1241
- return " old"
1242
- }).Value (&res)
1243
- // res = map[old:[1 3] even:[2 4]]
1244
- ```
1245
-
1246
1183
<a name =" values " />
1247
1184
1248
1185
### Values(source)
@@ -1336,6 +1273,11 @@ res := WhereBy(src, map[string]interface{}{
1336
1273
```
1337
1274
1338
1275
## Release Notes
1276
+ ~~~
1277
+ v1.1.0 (2018-06-02)
1278
+ * 增加IEnumerable、IEnumerator
1279
+ * All、Any、Chain2、Find、First、Range2、Value支持IEnumerable
1280
+ ~~~
1339
1281
1340
1282
~~~
1341
1283
v1.0.0 (2018-04-23)
0 commit comments