Search code examples
javascriptreactjsecmascript-6destructuring

Conditional (dynamic) destructuring


Depending on the selected language, I need to destruct the object and get the desired value.
How do I do this so as not to destruct the entire object?

const translate = {
   "navMenu1": {
      "en": "Menu 1",
      "ru": "Меню 1"
   },
   "navMenu2": {
      "en": "Menu 2",
      "ru": "Меню 2"
   },
   "navMenu3": {
      "en": "Menu 3",
      "ru": "Меню 3"
   }
}

const Header = props => {
  const { lang } = props;

  const {
    navMenu1,
    navMenu2,
    navMenu3
  } = translate;

  return (
    <header className={cnGreetingHeader}>
      <div>-Logo-</div>
      <nav className={cnNav}>
        <div className={cnItem}>{navMenu1[lang]}</div>
        <div className={cnItem}>{navMenu2[lang]}</div>
        <div className={cnItem}>{navMenu3[lang]}</div>
      </nav>
    </header>
  );
};

I want instead

<div className={cnItem}>{navMenu1[lang]}</div> 

Use

<div className={cnItem}>{navMenu1}</div>

Important: I would like an answer that uses destructuring assignment, if possible.


Solution

  • You could take a nested destructuring and take the outer name as variable.

    const
        translate = { navMenu1: { en: "Menu 1", ru: "Меню 1" }, navMenu2: { en: "Menu 2", ru: "Меню 2" }, navMenu3: { en: "Menu 3", ru: "Меню 3" } },
        Header = props => {
            const
                { lang } = props,
                {
                    navMenu1: { [lang]: navMenu1 },
                    navMenu2: { [lang]: navMenu2 },
                    navMenu3: { [lang]: navMenu3 }
                } = translate;
    
            console.log(navMenu1);
            console.log(navMenu2);
            console.log(navMenu3);
        };
    
    Header({ lang: 'en' });