diff --git a/gabs.go b/gabs.go index ed985a6..460cd5b 100644 --- a/gabs.go +++ b/gabs.go @@ -155,17 +155,22 @@ func (g *Container) searchStrict(allowWildcard bool, hierarchy ...string) (*Cont } case []interface{}: if allowWildcard && pathSeg == "*" { - tmpArray := []interface{}{} - for _, val := range typedObj { - if (target + 1) >= len(hierarchy) { - tmpArray = append(tmpArray, val) - } else if res := Wrap(val).Search(hierarchy[target+1:]...); res != nil { - tmpArray = append(tmpArray, res.Data()) + var tmpArray []interface{} + if (target + 1) >= len(hierarchy) { + tmpArray = typedObj + } else { + tmpArray = make([]interface{}, 0, len(typedObj)) + for _, val := range typedObj { + if res := Wrap(val).Search(hierarchy[target+1:]...); res != nil { + tmpArray = append(tmpArray, res.Data()) + } } } + if len(tmpArray) == 0 { return nil, nil } + return &Container{tmpArray}, nil } index, err := strconv.Atoi(pathSeg) diff --git a/gabs_test.go b/gabs_test.go index 378484d..1acb042 100644 --- a/gabs_test.go +++ b/gabs_test.go @@ -1914,3 +1914,20 @@ func TestFlattenIncludeEmpty(t *testing.T) { } } } + +func BenchmarkWildcardSearch(b *testing.B) { + sample := []byte(`{"test":[{"value":10},{"value":20}]}`) + + val, err := ParseJSON(sample) + if err != nil { + b.Fatalf("Failed to parse: %v", err) + } + + b.ReportAllocs() + b.ResetTimer() + + for i := 0; i < b.N; i++ { + val.Search([]string{"test", "*"}...) + val.Search([]string{"test", "*", "value"}...) + } +}