独特的阵列理解

时间:2014-08-12 09:13:04

标签: javascript arrays coffeescript

我在CoffeeScript中有以下数组:

electric_mayhem = [ { name: "Doctor Teeth", instrument: "piano" },
                { name: "Janice", instrument: "piano" },
                { name: "Sgt. Floyd Pepper", instrument: "bass" },
                { name: "Zoot", instrument: "sax" },
                { name: "Lips", instrument: "bass" },
                { name: "Animal", instrument: "drums" } ]

我的目标是获取此阵列中的所有乐器名称。

预期结果:['piano', 'bass', 'sax', 'drums']

我的第一个解决方案基于this

names = (muppet.instrument for muppet in electric_mayhem)
output = {}
output[name] = name for name in names
names = (value for key, value of output)

这是相当长的。我查看了已编译的javascript,并看到第一行被翻译为:

names = (function() {
  var _i, _len, _results;
  _results = [];
  for (_i = 0, _len = electric_mayhem.length; _i < _len; _i++) {
    muppet = electric_mayhem[_i];
    _results.push(muppet.instrument);
  }
  return _results;
})();

所以我编写了一个超级hacky解决方案,它使用了在转换过程中引入的_results变量:

names = (muppet.instrument for muppet in electric_mayhem \
  when muppet.instrument not in _results)

它有效,但我不喜欢它依赖于未记录的变量名称,因此可能会破坏未来的CoffeeScript版本。

是否有任何一个班轮来实现&#34;独特的理解&#34;以一种非黑客的方式?

1 个答案:

答案 0 :(得分:1)

这个单行可能会做到这一点:

names = (key for key of (new -> @[o.instrument] = '' for o in electric_mayhem; @))
//                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//                                 "object comprehension"

作为您自己,我(ab)使用关联数组将其键用作唯一值集。

但是,这里真正的技巧是使用“对象理解”来构建该数组。或至少,它目前在CoffeeScript上可用的最接近的等效形式:

    (new -> @[o.instrument] = '' for o in electric_mayhem; @)
//   ^^^  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  ^  
//  create                 with                            |
//  a new                  that                            |
//  empty                anonymous                         |
//  object               constructor                       |
//                                           don't forget -/
//                                           to return the
//                                        newly created object