【问题标题】:How to access to nested objects keys如何访问嵌套对象键
【发布时间】:2018-12-27 12:11:19
【问题描述】:

我正在尝试从具有嵌套对象的数据文件中获取值。

我想为我在 EN 对象下的每个条目创建一个标签。所以我希望最终有一个 "mail" 标签、一个 "quote" 标签和一个 "phone" 标签。

在标签中,我想通过访问将 tabLabel 和 tabIcon 的内容放入其中。

使用 Object.Keys() 我可以看到字符串,但是当我尝试 console.log 时,我得到 undefined。

我做了这个功能,但没有工作:

function generateLabel() {
  const keys = Object.keys(TabFormData.EN);
  for (let i = 0; i < keys; i += 1) {
    return `
      <div class="${ID}_tab-form__headerItemWrap">
        <label for="taLabel-here"><i class="tabIcon-here"></i></label>
      </div>
    `;
  }
}

这是数据:

const TabFormData = {
  EN: {
    mail: [
      {
        tabLabel: 'Email Our Team',
        tabIcon: 'fa fa-envelope',
      },
      {
        label: 'First Name',
        type: 'text',
        name: 'name',
        required: true,
        hint: 'Please, provide your Name.',
      },
      {
        label: 'Last Name',
        type: 'text',
        name: 'surname',
        required: true,
        hint: 'Please, provide your Last Name.',
      },
      {
        label: 'Email Address',
        type: 'email',
        name: 'email',
        required: true,
        hint: 'Please, provide a valid email.',
      },
      {
        label: 'Your Message',
        type: 'textarea',
        required: true,
        name: 'message',
        hint: 'Write us a message.',
        rows: 20,
        cols: 50,
      },
      {
        label: 'About You',
        required: true,
        select: [
          'Home use',
          'Business use',
          'Freelance, professional',
        ],
      },
    ],
    quote: [
      {
        tabLabel: 'Request a Quote',
        tabIcon: 'fa fa-file-invoice-dollar',
      },
      {
        label: 'First Name',
        type: 'text',
        name: 'name',
        required: true,
        hint: 'Please, provide your Name.',
      },
      {
        label: 'Last Name',
        type: 'text',
        name: 'surname',
        required: true,
        hint: 'Please, provide your Last Name.',
      },
      {
        label: 'Phone Number',
        type: 'number',
        name: 'telephone',
        required: true,
        hint: 'Please, provide a valid number',
      },
      {
        label: 'Email Address',
        type: 'email',
        name: 'email',
        required: false,
        hint: 'Please, provide a valid email.',
      },
      {
        label: 'Your Message',
        type: 'textarea',
        required: false,
        name: 'message',
        hint: 'Write us a message.',
        rows: 20,
        cols: 50,
      },
      {
        label: 'About You',
        required: true,
        select: [
          'Home use',
          'Business use',
          'Freelance, professional',
        ],
      },
    ],
    call: [
      {
        tabLabel: 'Call Me Back',
        tabIcon: 'fa fa-phone',
      },
      {
        label: 'First Name',
        type: 'text',
        name: 'name',
        required: true,
        hint: 'Please, provide your Name.',
      },
      {
        label: 'Last Name',
        type: 'text',
        name: 'surname',
        required: true,
        hint: 'Please, provide your Last Name.',
      },
      {
        label: 'Phone Number',
        type: 'number',
        name: 'telephone',
        required: true,
        hint: 'Please, provide a valid number',
      },
      {
        label: 'About You',
        required: true,
        select: [
          'Home use',
          'Business use',
          'Freelance, professional',
        ],
      },
    ],
  },
  IT: {

  },
};

【问题讨论】:

标签: javascript


【解决方案1】:

你的问题在循环中。

for (let i = 0; i &lt; keys; i += 1)

在这里,您正在检查 i 是否小于数组对象,这不是您想要的。 您想将 i 与数组中的项目数进行比较。

所以会变成这样:

for (let i = 0; i &lt; keys.length; i += 1)

您的字符串文字也是错误的,ID 在这种情况下是一个未定义的变量。我假设您想要密钥的名称。对于这个问题,它应该变成:

&lt;div class="${keys[i]}_tab-form__headerItemWrap"&gt;

此外,一旦你从 for 循环中 return,它会在第一次迭代时自动中断(这意味着你总是只会得到一个项目)。你可以做的是先构建你的整个字符串然后返回它。

那会让你的函数变成:

function generateLabel() {
  const keys = Object.keys(TabFormData.EN);
  var str = "";
  for (let i = 0; i < keys.length; i += 1) {
    str +=
      `<div class="${keys[i]}_tab-form__headerItemWrap">
        <label for="taLabel-here"><i class="tabIcon-here"></i></label>
      </div>
    `;
  }

  return str;
}

Here's a Fiddle.

【讨论】:

    【解决方案2】:

    如果我理解正确,你看起来是这样的:

    let cb = (v) => `<div class="${v[0]}"><label for="${v[1][0]['tabLabel']}"><i class="${v[1][0]['tabIcon']}"></i></label></div>`
    Object.entries(TabFormData['EN']).map(cb); 
    

    Object.keys() 返回对象的唯一键,但您似乎也想访问这些值。因此,在您的情况下,Object.entries() 是首选。

    我建议阅读以下链接: https://javascript.info/keys-values-entries

    【讨论】:

    • 谢谢,这就是我要找的。我还发现我以错误的方式导入数据。 import TabFormData 而不是 import { TabFormData }。
    • 编码愉快!如果那是您的解决方案,请投票
    【解决方案3】:

    正如@Adriani6 所报告的,您在循环中遇到了问题,但要真正回答您的问题,以下是访问嵌套对象的方法:

    function generateLabel() {
        const keys = Object.keys(TabFormData.EN);
        for (let i = 0; i < keys.length; i += 1) {
            let currentTabObject = TabFormData.EN[keys[i]];
            console.log(currentTabObject[0].tabLabel);
            console.log(currentTabObject[0].tabIcon);
        }
    }
    

    【讨论】:

      【解决方案4】:

      假设您将 TabFormData.EN 分配给名为 data 的变量,并将 TabFormData.EN 的 Object.keys 结果分配给变量叫keys,你可以使用:

      • ${keys[i]} 检索名称并将其附加到您的 div 类名,
      • ${data[keys[i]][0].tabLabel} 检索 tabLabel 属性值并将其附加到您的 label> 标记,并且
      • ${data[keys[i]][0].tabIcon} 检索 tabIcon 属性值并将其附加到您的 &lt;i&gt; 标记。

      您可以忽略&lt;hr&gt; 标签、&lt;button&gt; 标签和呈现的&lt;div&gt; 标签,如果需要,只需检查下面代码 sn-p 中的对象属性引用。它们只是用于说明jsFiddle 中的代码结果和下面的代码 sn-p:

      /* JavaScript */
      var x = document.getElementById('abc');
      var btn = document.getElementById('btn');
      
      function generateLabel() {
        const data = TabFormData.EN;
        const keys = Object.keys(data);
        
        for (let i = 0; i < keys.length; i += 1) {
          x.innerHTML += `
          	<hr>
                <div class="${keys[i]}_tab-form__headerItemWrap">
                  <label for="${data[keys[i]][0].tabLabel}">
                    <i class="${data[keys[i]][0].tabIcon}-here">
                        class of this div is ${keys[i]}_tab-form__headerItemWrap, label for this is ${data[keys[i]][0].tabLabel} and icon is ${data[keys[i]][0].tabIcon}
                    </i>
                  </label>
                </div>
              <hr>`
        }
      }
      
      btn.addEventListener('click', generateLabel);
      
      const TabFormData = {
        EN: {
          mail: [
            {
              tabLabel: 'Email Our Team',
              tabIcon: 'fa fa-envelope',
            },
            {
              label: 'First Name',
              type: 'text',
              name: 'name',
              required: true,
              hint: 'Please, provide your Name.',
            },
            {
              label: 'Last Name',
              type: 'text',
              name: 'surname',
              required: true,
              hint: 'Please, provide your Last Name.',
            },
            {
              label: 'Email Address',
              type: 'email',
              name: 'email',
              required: true,
              hint: 'Please, provide a valid email.',
            },
            {
              label: 'Your Message',
              type: 'textarea',
              required: true,
              name: 'message',
              hint: 'Write us a message.',
              rows: 20,
              cols: 50,
            },
            {
              label: 'About You',
              required: true,
              select: [
                'Home use',
                'Business use',
                'Freelance, professional',
              ],
            },
          ],
          quote: [
            {
              tabLabel: 'Request a Quote',
              tabIcon: 'fa fa-file-invoice-dollar',
            },
            {
              label: 'First Name',
              type: 'text',
              name: 'name',
              required: true,
              hint: 'Please, provide your Name.',
            },
            {
              label: 'Last Name',
              type: 'text',
              name: 'surname',
              required: true,
              hint: 'Please, provide your Last Name.',
            },
            {
              label: 'Phone Number',
              type: 'number',
              name: 'telephone',
              required: true,
              hint: 'Please, provide a valid number',
            },
            {
              label: 'Email Address',
              type: 'email',
              name: 'email',
              required: false,
              hint: 'Please, provide a valid email.',
            },
            {
              label: 'Your Message',
              type: 'textarea',
              required: false,
              name: 'message',
              hint: 'Write us a message.',
              rows: 20,
              cols: 50,
            },
            {
              label: 'About You',
              required: true,
              select: [
                'Home use',
                'Business use',
                'Freelance, professional',
              ],
            },
          ],
          call: [
            {
              tabLabel: 'Call Me Back',
              tabIcon: 'fa fa-phone',
            },
            {
              label: 'First Name',
              type: 'text',
              name: 'name',
              required: true,
              hint: 'Please, provide your Name.',
            },
            {
              label: 'Last Name',
              type: 'text',
              name: 'surname',
              required: true,
              hint: 'Please, provide your Last Name.',
            },
            {
              label: 'Phone Number',
              type: 'number',
              name: 'telephone',
              required: true,
              hint: 'Please, provide a valid number',
            },
            {
              label: 'About You',
              required: true,
              select: [
                'Home use',
                'Business use',
                'Freelance, professional',
              ],
            },
          ],
        },
        IT: {
      
        },
      };
      /* CSS */
      <!-- HTML -->
      
      <button id="btn">
      Click Me
      </button>
      <div id="abc"></div>

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-10
        • 1970-01-01
        • 2019-12-14
        • 2020-05-04
        • 1970-01-01
        • 2022-01-08
        相关资源
        最近更新 更多