আমি কীভাবে ভিমে দুটি অভিধানকে একীভূত করতে পারি?


9

আমার দুটি ডিক্টস রয়েছে:

:let defaults = {'hello': 'world', 'bye': 'jupiter'}

:let override = {'hello': 'mars'}

কীভাবে কীগুলি কীভাবে মার্জ করতে পারি overrideযাতে আমি এর মতো একটি নতুন ডিক দিয়ে শেষ করতে পারি:

{'hello': 'mars', 'bye': 'jupiter'}

উত্তর:


7

আপনি ব্যবহার করতে পারেন extend():

:let defaults = {'hello': 'world', 'bye': 'jupiter'}
:let override = {'hello': 'mars'}

:echo extend(defaults, override)
{'hello': 'mars', 'bye': 'jupiter'}

দ্বিতীয় আর্গুমেন্টের কীগুলি প্রথমে বিদ্যমান বিদ্যমানগুলিকে ওভাররাইড করে। defaultsঅভি করা হবে জায়গা পরিবর্তন , চেয়েছিলেন নাও হতে পারে পারে। 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()যদি এটি জায়গায় রেখে (কিছুটা দ্রুত, তবে সম্ভবত অপ্রত্যাশিত) পরিবর্তন করতে চান তবে আপনি এটিকে সরাতে পারেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.