【问题标题】:Write name of array on the go from name + variable从名称+变量中随时写入数组的名称
【发布时间】:2023-04-02 04:37:01
【问题描述】:

我有这样的数组组件,可以打印出 Good。

console.log(nameA_componentA['abc'].aaa);

但现在我想这样打印出来

var ccc='componentA';
console.log(nameA_+ccc['abc'].aaa);

但不幸的是它不起作用:( 我的错在哪里?

【问题讨论】:

  • 在这种情况下你应该使用 Eval
  • 在数据结构中?我建议对命名部分使用对象,而不是使用变量部分命名变量。
  • 假设对象存在于全局命名空间中,window['nameA_' + ccc]['abc'].aaa

标签: javascript jquery


【解决方案1】:

虽然不推荐,但您可以在 Javascript 中执行此操作,而无需使用 eval()。由于全局变量是 window 对象的后代,因此您可以像这样访问它们:

var ccc='componentA';
console.log(window['nameA_' + ccc]['abc'].aaa);

但是使用对象/数组而不是使用这种方法可能是更好的做法。

【讨论】:

    【解决方案2】:

    你可以使用(window || context)['nameA_' + ccc].abc.aaa

    const nameA_componentA = {
      abc: {
        aaa: 'Good'
      }
    }
    console.log(nameA_componentA['abc'].aaa);
    const ccc='componentA';
    // this isn't working in the stack snippets
    // console.log(window['nameA_' + ccc]['abc'].aaa);
    
    // you are better off namespacing
    const nameA = {
      componentA: { abc: { aaa: 'Good' }},
      componentB: { abc: { aaa: 'Great' }}
    }
    
    console.log(nameA[ccc].abc.aaa)

    【讨论】:

      【解决方案3】:

      对于这种情况,您可以使用eval

      var nameA_componentA = {
        abc: {
          aaa: 'Hello World'
        }
      }
      
      var ccc='componentA';
      var obj = eval('nameA_'+ccc);
      console.log(obj['abc'].aaa)
      //console.log(nameA_+ccc['abc'].aaa);

      注意:如果您可以选择重组代码以将所有此类对象包装在包装器对象中,那么您应该这样做。考虑eval 作为最后的手段。

      var nameA_componentA = {
        abc: {
          aaa: 'Hello World'
        }
      }
      var nameA_componentB = {
        abc: {
          aaa: 'Hello Foo'
        }
      }
      
      var wrapperObj = {
        nameA_componentA: nameA_componentA,
        nameA_componentB: nameA_componentB
      }
      
      var ccc='componentA';
      var ccc1='componentB';
      console.log( wrapperObj['nameA_'+ccc]['abc'].aaa);
      console.log( wrapperObj['nameA_'+ccc1]['abc'].aaa);

      参考文献

      【讨论】:

        猜你喜欢
        • 2015-12-29
        • 2012-06-13
        • 1970-01-01
        • 1970-01-01
        • 2021-10-22
        • 2016-04-27
        • 2012-05-09
        • 2021-07-02
        • 1970-01-01
        相关资源
        最近更新 更多