Python列表推导式与Node.js/JavaScript

9

有没有类似于Python列表推导式的东西可以用于Node.js/JavaScript?如果没有,那么是否可能创建一个具有类似行为的函数?

# Example 1

list_one = [[1, 2], [3, 4], [5, 6], [7, 8]]
someOfList = sum(x[1] for x in list_one)
print(someOfList) # prints 20

# Example 2
combined = "".join([str( ( int(x) + int(y) ) % 10) for x, y in zip("9999", "3333")])
print(combined) # prints 2222

等等?还是说你需要为每个理解编写函数以实现相应的行为?我知道你可以为每个理解编写函数,但如果你使用大量的列表解析式,代码会变得很长。


这个问题几个月前在 这里 被问到过,但是由于事情变化得非常快,我认为这个问题不是重复的。 - Ray Toal
2个回答

14
列表推导式将通常使用mapfilter完成的操作编入语言的语法中。

因此,给定Python列表推导式,您也可以使用map和filter:

# Python - preferred way
squares_of_odds = [x * x for x in a if x % 2 == 1]

# Python - alternate way
map(lambda x: x * x, filter(lambda x: x % 2 == 1, a))

尽管Python更喜欢使用推导式,但JavaScript有mapfilter函数,你现在可以使用它们。
// JavaScript
a.map(function(x){return x*x}).filter(function(x){return x%2 == 1})

JavaScript的即将发布的版本将在语言中引入数组推导式
[ x*x for (x of a) if (x % 2 === 1) ]

要查看即将推出的版本中现有的内容,请参见此兼容性表。截至本文撰写时,您可以看到它们在Firefox中可用。

你能在NodeJS中测试这个数组推导式吗?我在Node中尝试过,但是 var myArray = ["one", 2, 3.0, [4, 5, "six"]]; [x for (x of myArray)] 报错:SyntaxError: Unexpected token for。我在Chrome控制台中也无法使其正常工作。 - hhh
1
抱歉,这是一个4年半前的答案,在我写这篇文章的时候,JS看起来将会获得数组推导式,但事实并非如此。它目前是一项非标准功能:http://kangax.github.io/compat-table/non-standard/,在Node中也不支持,实际上任何地方都不支持!事情似乎是不稳定的。 :) - Ray Toal

0

这就是为什么 CoffeeScript 被发明出来的原因,您可以通过复制并粘贴您的代码 here (进入“尝试 CoffeeScript”选项卡)来试一试。

这就是它刚才给我的东西:

var combined, list_one, someOfList, x, y;

list_one = [[1, 2], [3, 4], [5, 6], [7, 8]];

someOfList = sum((function() {
  var _i, _len, _results;
  _results = [];
  for (_i = 0, _len = list_one.length; _i < _len; _i++) {
    x = list_one[_i];
    _results.push(x[1]);
  }
  return _results;
})());

print(someOfList);

combined = "".join([
  (function() {
    var _i, _len, _ref, _results;
    _ref = zip("9999", "3333");
    _results = [];
    for (y = _i = 0, _len = _ref.length; _i < _len; y = ++_i) {
      x = _ref[y];
      _results.push(str((int(x) + int(y)) % 10));
    }
    return _results;
  })()
]);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接