func (v *Value) ObjxMap(optionalDefault ...(Map)) Map {
	if s, ok := v.data.((Map)); ok {
		return s
	}
	if s, ok := v.data.(map[string]interface{}); ok {
		return s
	}
	if len(optionalDefault) == 1 {
		return optionalDefault[0]
	}
	return New(nil)
}
/*
ObjxMap ((Map) and [](Map))

ObjxMap gets the value as a (Map), returns the optionalDefault
value or a system default object if the value is the wrong type.
package objx
func (v *Value) MSI(optionalDefault ...map[string]interface{}) map[string]interface{} {
	if s, ok := v.data.(map[string]interface{}); ok {
		return s
	}
	if s, ok := v.data.(Map); ok {
		return map[string]interface{}(s)
	}
	if len(optionalDefault) == 1 {
		return optionalDefault[0]
	}
	return nil
}
func (v *Value) MustMSI() map[string]interface{} {
	if s, ok := v.data.(Map); ok {
		return map[string]interface{}(s)
	}
	return v.data.(map[string]interface{})
}
func (v *Value) MSISlice(optionalDefault ...[]map[string]interface{}) []map[string]interface{} {
	if s, ok := v.data.([]map[string]interface{}); ok {
		return s
	}
	s := v.ObjxMapSlice()
	if s == nil {
		if len(optionalDefault) == 1 {
			return optionalDefault[0]
		}
		return nil
	}
	result := make([]map[string]interface{}, len(s))
	for i := range s {
		result[i] = s[i].Value().MSI()
	}
	return result
}
func (v *Value) MustMSISlice() []map[string]interface{} {
	if s := v.MSISlice(); s != nil {
		return s
	}
	return v.data.([]map[string]interface{})
}
func (v *Value) IsMSI() bool {
	_, ok := v.data.(map[string]interface{})
	if !ok {
		_, ok = v.data.(Map)
	}
	return ok
}
func (v *Value) IsMSISlice() bool {
	_, ok := v.data.([]map[string]interface{})
	if !ok {
		_, ok = v.data.([]Map)
		if !ok {
			s, ok := v.data.([]interface{})
			if ok {
				for i := range s {
					switch s[i].(type) {
					case Map:
					case map[string]interface{}:
					default:
						return false
					}
				}
				return true
			}
		}
	}
	return ok
}
func (v *Value) EachMSI(callback func(int, map[string]interface{}) bool) *Value {
	for index, val := range v.MustMSISlice() {
		carryon := callback(index, val)
		if !carryon {
			break
		}
	}
	return v
}
func (v *Value) WhereMSI(decider func(int, map[string]interface{}) bool) *Value {
	var selected []map[string]interface{}
	v.EachMSI(func(index int, val map[string]interface{}) bool {
		shouldSelect := decider(index, val)
		if !shouldSelect {
			selected = append(selected, val)
		}
		return true
	})
	return &Value{data: selected}
}
func (v *Value) GroupMSI(grouper func(int, map[string]interface{}) string) *Value {
	groups := make(map[string][]map[string]interface{})
	v.EachMSI(func(index int, val map[string]interface{}) bool {
		group := grouper(index, val)
		if _, ok := groups[group]; !ok {
			groups[group] = make([]map[string]interface{}, 0)
		}
		groups[group] = append(groups[group], val)
		return true
	})
	return &Value{data: groups}
}
func (v *Value) ReplaceMSI(replacer func(int, map[string]interface{}) map[string]interface{}) *Value {
	arr := v.MustMSISlice()
	replaced := make([]map[string]interface{}, len(arr))
	v.EachMSI(func(index int, val map[string]interface{}) bool {
		replaced[index] = replacer(index, val)
		return true
	})
	return &Value{data: replaced}
}
func (v *Value) CollectMSI(collector func(int, map[string]interface{}) interface{}) *Value {
	arr := v.MustMSISlice()
	collected := make([]interface{}, len(arr))
	v.EachMSI(func(index int, val map[string]interface{}) bool {
		collected[index] = collector(index, val)
		return true
	})
	return &Value{data: collected}
}