我知道在Java中有一个双冒号(::) lambda,允许你编写如下的回调:Stream.of(new Object(), new Object()).map(Object::toString)
。
所以我想知道是否有一个Babel插件或任何其他方式在Javascript(NodeJS)中有类似的lambda?
编辑:不只是使用本机对象。 (例如:Person::name
)
答案 0 :(得分:2)
Java方法可以是静态的,也可以不是静态的,参数和返回由类型提示和已知编译时间决定。 JavaScript函数可以被称为方法或静态,甚至是相同的函数,并且不知道哪种类型进入或退出,甚至没有设置参数的数量。由于无法进行任何类型推断,因此您需要明确说明您将要做的事情:
[{}, {}].map(o => o.toString());
; ==> [ '[object Object]', '[object Object]' ]
如果您只是引用该功能:
[{}, {}].map(Object.prototype.toString);
; ==> [ '[object Undefined]', '[object Undefined]' ]
原因是对象作为参数传递,Object.prototype.toString("something")
尝试在功能上下文中使用this
undefined
。因为它不被称为方法。你可以创建一个能够满足你想要的功能:
function mapMember(fn) {
return (v) => fn.call(v);
}
[{}, {}].map(mapMember(Object.prototype.toString));
// ==> [ '[object Object]', '[object Object]' ]
我发现过于冗长所以我倾向于使用字符串:
function mapMember(str) {
return v => v[str]();
}
[{}, {}].map(mapMember('toString'));
// ==> [ '[object Object]', '[object Object]' ]
使用相同的方法,您可以轻松地创建一个获取字段的变体:
function mapProperty(str) {
return v => v[str];
}
[{test: 'hello'}, {test: 'world'}].map(mapProperty('test'));
// ==> [ 'hello', 'world' ]
或者你可以同时做到这两点:
function mapObject(str) {
return v => typeof v[str] === 'function' ? v[str]() : v[str];
}
[{test: 'hello'}, { test() { return 'world!'; } }].map(mapObject('test'));
// ==> [ 'hello', 'world' ]
这种情况的局限性在于您永远不会收集成员函数,因为它们将被应用。
请注意,有很多方法可以做到这一点,所以这只是一个如何将抽象应用于代码的示例。
答案 1 :(得分:0)
您将编写一个回调函数,该函数返回对象中的字段。所以说你有一个看似......的对象。
const person = { name: 'DrunkenPoney' };
您可以将一组人物映射到他们的名字集合中,如此......
const names = people.map(person => person.name);
如果你必须使用ES5 javascript它看起来像这样......
var names = people.map(function(person) { return person.name; });