【问题标题】:Something like list comprehension in JS?JS中的列表理解之类的东西?
【发布时间】:2015-05-05 12:39:43
【问题描述】:

例如,在 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 中可以使用这种单行代码吗?

【问题讨论】:

  • 这是一个列表推导,而不是一个生成器表达式。
  • 作为 JS 的替代方案,您可以使用 Array#mapaltered_values = values.map(function (v) { return v*25; });,而使用 ES6,您可以缩短:altered_values = values.map(v => v*25);
  • @Matthias 是的,我的错。已编辑。
  • @JamesAllardice 性能有何不同?
  • @yxfxmx - map 可能比普通的 for 循环慢,但不太可能对现实世界产生任何影响。两者都应该比使用理解和转译到 ES5 快得多。

标签: javascript python list-comprehension


【解决方案1】:

简短回答:不。

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

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

目前它们仅受 Spidermonkey 引擎支持,即。火狐。

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

【讨论】:

  • 请注意,Babel 也支持它们,因此可以使用它们并转译为 ES5。
  • @JamesAllardice,非常简洁,感谢您的提醒!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-19
    • 2017-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多