类似于 JS 中的列表理解?

问题描述 投票:0回答:3

例如,在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 中可能吗?

javascript python list-comprehension
3个回答
5
投票

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 都会返回未定义的值。 看起来像:

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

当然

filter
在这个例子中效果会更好。
您可以在here找到有关生成器函数的文档。


4
投票

简短回答:不。

长答案:在非常特殊的情况下:数组推导式是一种非常相似的工具,可能存在于该语言的 ECMAScript 7 版本中(即下一个)。有了它们你可以写:

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

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

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


0
投票

现代 JS 的一句台词是:

altered_values = values.map(v => v*25)
© www.soinside.com 2019 - 2024. All rights reserved.