我有两个决定:
:let defaults = {'hello': 'world', 'bye': 'jupiter'}
:let override = {'hello': 'mars'}
如何合并来自的键,override
以便最终得到一个新的字典,如下所示:
{'hello': 'mars', 'bye': 'jupiter'}
我有两个决定:
:let defaults = {'hello': 'world', 'bye': 'jupiter'}
:let override = {'hello': 'mars'}
如何合并来自的键,override
以便最终得到一个新的字典,如下所示:
{'hello': 'mars', 'bye': 'jupiter'}
Answers:
您可以使用extend()
:
:let defaults = {'hello': 'world', 'bye': 'jupiter'}
:let override = {'hello': 'mars'}
:echo extend(defaults, override)
{'hello': 'mars', 'bye': 'jupiter'}
第二个参数中的键会覆盖第一个参数中的所有键。该defaults
dict将被修改到位,这可能是不需要的。使用copy()
以防止:
:call extend(copy(defaults), override)
:echo defaults
{'hello': 'world', 'bye': 'jupiter'}
当您将字典传递给函数时,尤其要注意这一点,因为它是通过引用传递的(因此也将在函数外部进行修改)。
请注意,它不会合并嵌套的字典,这可能不是好事,具体取决于您要查找的内容:
:echo extend({'nest': {'a': 'b'}}, {'nest': {'b': 'XXXX'}})
{'nest': {'b': 'XXXX'}}
您将需要一个小的辅助函数来递归合并嵌套的字典:
" Merge two dictionaries, also recursively merging nested keys.
"
" Use extend() if you don't need to merge nested keys.
fun! s:merge(defaults, override) abort
let l:new = copy(a:defaults)
for [l:k, l:v] in items(a:override)
let l:new[l:k] = (type(l:v) is v:t_dict && type(get(l:new, l:k)) is v:t_dict)
\ ? s:merge(l:new[l:k], l:v)
\ : l:v
endfor
return l:new
endfun
copy()
如果要就地修改它,可以将其删除(速度较快,但可能出乎意料)。