像JS中的列表理解一样?

时间:2015-05-05 12:39:43

标签: javascript python list-comprehension

例如,在Python中我们有一个方便的工具 - 而不是像

那样编写
values = [1,2,3,4,5]
altered_values = []
for v in values:
    altered_values.append(v*25)

我们可以写

altered_values = [v*25 for v in values]

Javascript中有这样的单行吗?

2 个答案:

答案 0 :(得分:3)

简答:不。

答案很长:在非常特殊的情况下:Array comprehensions是一个非常相似的工具,可能会出现在ECMAScript 7版本的语言中(即接下来的版本)。有了它们,你可以写:

var altered_values = [for (v of values) v*25];

目前它们仅受Spidermonkey引擎支持,即。 Firefox浏览器。

编辑:正如JamesAllardice在下面指出的那样,它们也可以通过Babel转换库使用,这意味着您几乎可以在任何浏览器中使用它们。

答案 1 :(得分:1)

Babel用于支持理解的语法,但不再支持。现代浏览器都不再支持理解了。此外,截至2017年,似乎没有计划在不久的将来随时重新添加支持。但是,使用ES6,您可以使用生成器函数来模拟类似python的列表理解的功能: 考虑这个例子:

const someArray = [1,2,3,4,5,6];
const evens = [...(function*() { for(let x of someArray) if(x%2 == 0) yield x;})()]
console.log(evens);
// [2,4,6]

这适用于支持当前ES6标准的浏览器。现在有一个针对箭头生成器的提议,这会使这种语法缩短一点。

我绝对不会在生产代码中使用它,除非你(以及所有正在编写代码的人)非常习惯使用生成器作为迭代器。还有它的那种丑陋。但是,它确实比map更具优势。如果您使用map实现了相同的功能,那么您之后还需要记住compact。这是因为对于所有不均匀的数字,map将返回undefined。 那看起来像是:

const someArray = [1,2,3,4,5,6];
const evens = someArray.map(x => {
  if(x % 2 === 0) return x;
});

当然filter在这个例子中效果更好 您可以在生成器函数here上找到文档。