我在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;以一种非黑客的方式?
答案 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