将对象值作为Associate数组值进行访问

时间:2013-07-04 16:18:08

标签: javascript

我有一个关联数组:

  instrumentLookup: {
    hh: {label: 'Hi Hat', type: 'hh'},
    kd: {label: 'Kick Drum', type: 'kd'},
    o1: {label: 'other1', type: 'o1'},
    o2: {label: 'other2', type: 'o2'}
  }

我认为这种结构没问题,但可能有更好的方法。

我正在尝试通过此函数从此列表创建一个工具,其中参数addedInstrument与标签的字符串相同,因此hhkd,{{ 1}},....:

o1

这里有几个问题,随时回答任何或所有问题或建议替代方案:

  • 当Object是关联数组的值时,如何访问Object属性?
  • 我应该从Associate数组中将它更改为嵌套对象{type:{other attrs}}的数组[]吗?

2 个答案:

答案 0 :(得分:3)

您需要括号表示法来动态访问属性名称。

instrumentLookup[ addedIntrument ].label

答案 1 :(得分:2)

  

当Object是关联数组的值时,如何访问Object属性?

这很简单。你可以这样做:console.log(instrumentLookup.hh.label); //Hi Hat

console.log(instrumentLookup.hh['label']); //Hi Hat

  

我应该从关联数组中将其更改为嵌套对象{type:{other attrs}}的数组[]吗?

如果需要数组行为,则应使用数组。

来自评论:

  

那么为什么没有instrumentLookup.addedIntrument.label工作?

addedInstrument不是instrumentLookup的成员,因此您无法使用.来访问它(它将是未定义的)。相反,您需要执行:instrumentLookup[addedInstrument]

  

我认为这种结构还可以,但可能有更好的方法。

您已经按type参数存储每个乐器,那么为什么要在对象内复制它?除非你不仅仅有Type和Label,否则你可以通过以下方式进一步简化:

var instrumentLookup = { hh: 'High Hat', 
                         kd: 'Kick Drum', 
                         o1: 'Other1', 
                         o2: 'Other2'}

并重写你的addInstrument方法:

addInstrument: function(addedInstrument) {
  console.warn(addedIntrument);
   var inst = this.defaults.instrumentLookcup[addedInstrument];
   if(inst) {
     this.unusedInstruments.push({label:inst, type:addedInstrument});
   }
}