0

我有一个关联数组:

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

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

我正在尝试通过这个函数从这个列表中创建一个工具,其中参数addedInstrument作为与标签相同的字符串出现,所以hh, kd, o1, ....:

addInstrument: function(addedIntrument) {
  console.warn(addedIntrument);
  var newLabel = this.defaults.instrumentLookup.addedIntrument.label;
  var newType = addedIntrument;
  console.warn(newLabel + ' ' + newType)
  // push it to the list
  // this.unusedInstruments.push({label:newLabel, type:newType});
}

这里有几个问题,请随时回答任何或全部或提出替代方案:

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

2 回答 2

3

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

instrumentLookup[ addedIntrument ].label
于 2013-07-04T16:21:56.687 回答
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参数存储了每个仪器,那么为什么要在对象中复制它呢?除非您拥有的不仅仅是类型和标签,否则您可以通过以下方式进一步简化它:

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});
   }
}
于 2013-07-04T16:20:13.143 回答