像 JS 中的列表理解之类的东西?
Something like list comprehension in JS?
例如,在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中可以使用这样的一行吗?
简答:没有。
长答案:有点,在非常特殊的情况下:Array comprehensions 是一个非常相似的工具,它可能存在于该语言的 ECMAScript 7 版本中(这是下一个)。有了它们你可以写:
var altered_values = [for (v of values) v*25];
目前它们仅受 Spidermonkey 引擎支持,即。火狐.
Edit:正如 JamesAllardice 在下面指出的,它们也可以通过 Babel 转译库使用,这意味着您实际上可以在任何浏览器中使用它们。
Babel 过去支持理解语法,但现在不再支持了。 None 的现代浏览器也不再支持理解。此外,截至 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 将 return undefined 用于所有奇数。
看起来像:
const someArray = [1,2,3,4,5,6];
const evens = someArray.map(x => {
if(x % 2 === 0) return x;
});
当然 filter
在这个例子中效果会更好。
您可以找到有关生成器函数的文档 here.
例如,在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中可以使用这样的一行吗?
简答:没有。
长答案:有点,在非常特殊的情况下:Array comprehensions 是一个非常相似的工具,它可能存在于该语言的 ECMAScript 7 版本中(这是下一个)。有了它们你可以写:
var altered_values = [for (v of values) v*25];
目前它们仅受 Spidermonkey 引擎支持,即。火狐.
Edit:正如 JamesAllardice 在下面指出的,它们也可以通过 Babel 转译库使用,这意味着您实际上可以在任何浏览器中使用它们。
Babel 过去支持理解语法,但现在不再支持了。 None 的现代浏览器也不再支持理解。此外,截至 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 将 return undefined 用于所有奇数。
看起来像:
const someArray = [1,2,3,4,5,6];
const evens = someArray.map(x => {
if(x % 2 === 0) return x;
});
当然 filter
在这个例子中效果会更好。
您可以找到有关生成器函数的文档 here.