diff --git a/src/eval.c b/src/eval.c
index 8da8205d5..b4c240df7 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -7236,6 +7236,7 @@ filter_map(typval_T *argvars, typval_T *rettv, int map)
 
        if (argvars[0].v_type == VAR_DICT)
        {
+           set_vim_var_type(VV_KEY, VAR_STRING);
            ht = &d->dv_hashtab;
            hash_lock(ht);
            todo = (int)ht->ht_used;
@@ -7252,7 +7253,7 @@ filter_map(typval_T *argvars, typval_T *rettv, int map)
                                || var_check_ro(di->di_flags,
                                                           arg_errmsg, TRUE)))
                        break;
-                   set_vim_var_string(VV_KEY, di->di_key, -1);
+                   set_vim_var_string2(VV_KEY, vim_strsave(di->di_key));
                    r = filter_map_one(&di->di_tv, expr, map, &rem);
                    clear_tv(get_vim_var_tv(VV_KEY));
                    if (r == FAIL || did_emsg)
diff --git a/src/evalvars.c b/src/evalvars.c
index e6fb3d898..103fb7ed6 100644
--- a/src/evalvars.c
+++ b/src/evalvars.c
@@ -2051,6 +2051,15 @@ set_vim_var_string(
        vimvars[idx].vv_str = vim_strnsave(val, len);
 }
 
+/*
+ * Set string v: variable to "val".
+ */
+    void
+set_vim_var_string2(int idx, char_u *val)
+{
+    vimvars[idx].vv_str = val;
+}
+
 /*
  * Set List v: variable to "val".
  */
diff --git a/src/proto/evalvars.pro b/src/proto/evalvars.pro
index b03141784..63fc94429 100644
--- a/src/proto/evalvars.pro
+++ b/src/proto/evalvars.pro
@@ -37,6 +37,7 @@ void set_vcount(long count, long count1, int set_prevcount);
 void save_vimvars(vimvars_save_T *vvsave);
 void restore_vimvars(vimvars_save_T *vvsave);
 void set_vim_var_string(int idx, char_u *val, int len);
+void set_vim_var_string2(int idx, char_u *val);
 void set_vim_var_list(int idx, list_T *val);
 void set_vim_var_dict(int idx, dict_T *val);
 void set_reg_var(int c);

