Javascript双冒号lambda

时间:2018-02-05 20:05:38

标签: javascript node.js lambda babel

我知道在Java中有一个双冒号(::) lambda,允许你编写如下的回调:Stream.of(new Object(), new Object()).map(Object::toString)

所以我想知道是否有一个Babel插件或任何其他方式在Javascript(NodeJS)中有类似的lambda?

编辑:不只是使用本机对象。 (例如:Person::name

2 个答案:

答案 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; });