# Idiom #280 Filter map

Remove all the elements from the map m that don't satisfy the predicate p.
Keep all the elements that do satisfy p.

Explain if the filtering happens in-place, i.e. if m is reused or if a new map is created.

``m.retain(|_, &mut v| p(v));``
``````for (auto it = m.begin(); it != m.end();) {
if (!p(it->second)) {
it = m.erase(it);
} else {
++it;
}
}``````
``````  real, dimension(:), allocatable :: a
a = pack(a,p(a))
!
elemental logical function p(x)
real, intent(in) :: x
p = x > 0.7
end function p

``````
``````for k, v := range m {
if !p(v) {
delete(m, k)
}
}``````
``import "golang.org/x/exp/maps"``
``````maps.DeleteFunc(m, func(k K, v V) bool {
return !p(v)
})``````
``uses classes;``
``````for i := m.count-1 downto 0 do
if not p(m.items[i]) then m.delete(i);``````
``````\$p = sub { \$_[0] };

while ( (\$k,\$v) = each %m ) {
\$f{\$k} = \$v if \$p->(\$v);
}

%m = %f;``````
``````\$p = sub { \$_[0] };

foreach \$k (keys %m) {
delete \$m{\$k} if not \$p->( \$m{\$k} );
}
``````
``m = {k:v for k, v in m.items() if p(v)}``
``````for k in list(m):
if p(m[k]): m.pop(k)
``````
``m.select{|k,v| p(v) }``

programming-idioms.org