123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- // Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
- //
- // This Source Code Form is subject to the terms of the MIT License.
- // If a copy of the MIT was not distributed with this file,
- // You can obtain one at https://github.com/gogf/gf.
- package gutil
- import (
- "github.com/gogf/gf/internal/utils"
- "reflect"
- )
- // MapCopy does a shallow copy from map `data` to `copy` for most commonly used map type
- // map[string]interface{}.
- func MapCopy(data map[string]interface{}) (copy map[string]interface{}) {
- copy = make(map[string]interface{}, len(data))
- for k, v := range data {
- copy[k] = v
- }
- return
- }
- // MapContains checks whether map `data` contains `key`.
- func MapContains(data map[string]interface{}, key string) (ok bool) {
- if len(data) == 0 {
- return
- }
- _, ok = data[key]
- return
- }
- // MapDelete deletes all `keys` from map `data`.
- func MapDelete(data map[string]interface{}, keys ...string) {
- if len(data) == 0 {
- return
- }
- for _, key := range keys {
- delete(data, key)
- }
- }
- // MapMerge merges all map from `src` to map `dst`.
- func MapMerge(dst map[string]interface{}, src ...map[string]interface{}) {
- if dst == nil {
- return
- }
- for _, m := range src {
- for k, v := range m {
- dst[k] = v
- }
- }
- }
- // MapMergeCopy creates and returns a new map which merges all map from `src`.
- func MapMergeCopy(src ...map[string]interface{}) (copy map[string]interface{}) {
- copy = make(map[string]interface{})
- for _, m := range src {
- for k, v := range m {
- copy[k] = v
- }
- }
- return
- }
- // MapPossibleItemByKey tries to find the possible key-value pair for given key ignoring cases and symbols.
- //
- // Note that this function might be of low performance.
- func MapPossibleItemByKey(data map[string]interface{}, key string) (foundKey string, foundValue interface{}) {
- if len(data) == 0 {
- return
- }
- if v, ok := data[key]; ok {
- return key, v
- }
- // Loop checking.
- for k, v := range data {
- if utils.EqualFoldWithoutChars(k, key) {
- return k, v
- }
- }
- return "", nil
- }
- // MapContainsPossibleKey checks if the given `key` is contained in given map `data`.
- // It checks the key ignoring cases and symbols.
- //
- // Note that this function might be of low performance.
- func MapContainsPossibleKey(data map[string]interface{}, key string) bool {
- if k, _ := MapPossibleItemByKey(data, key); k != "" {
- return true
- }
- return false
- }
- // MapOmitEmpty deletes all empty values from given map.
- func MapOmitEmpty(data map[string]interface{}) {
- if len(data) == 0 {
- return
- }
- for k, v := range data {
- if IsEmpty(v) {
- delete(data, k)
- }
- }
- }
- // MapToSlice converts map to slice of which all keys and values are its items.
- // Eg: {"K1": "v1", "K2": "v2"} => ["K1", "v1", "K2", "v2"]
- func MapToSlice(data interface{}) []interface{} {
- var (
- reflectValue = reflect.ValueOf(data)
- reflectKind = reflectValue.Kind()
- )
- for reflectKind == reflect.Ptr {
- reflectValue = reflectValue.Elem()
- reflectKind = reflectValue.Kind()
- }
- switch reflectKind {
- case reflect.Map:
- array := make([]interface{}, 0)
- for _, key := range reflectValue.MapKeys() {
- array = append(array, key.Interface())
- array = append(array, reflectValue.MapIndex(key).Interface())
- }
- return array
- }
- return nil
- }
|